打开模式
in:打开文件时做读操作;
out:打开文件时做写操作;
app:在每次写之前找到文件尾;
ate:打开文件后立即将文件定位在文件尾;(与ios::app存在区别)
trunc:打开文件时清空已存在的文件流;
binary:以二进制模式进行IO操作;(默认时采用的是 文本文件模式)
ios::out 写打开文件,无文件则创建,有则清空原文件
ios::in 读打开文件,无文件则打开失败,有则打开文件,不清空文件
ios::in|ios::out 读写打开文件,无则打开失败,有则不清空打开;文件指针在开头
ios::in|ios::app 读写打开文件,无则创建,有则打开,不清空,文件指针在开头,但只能在文件尾写
ios::out|ios::app 写打开文件,无则创建,有则打开,不清空,文件指针在开头,但只能在文件尾写,不能读
有效组合:
并不是所有的打开模式都可以同时制定,有些模式组合是没有意义的,例如:in和trunc,准备读取文件流,但是trunc清空了文件流。
out:打开文件时做写操作,删除已经存在的数据;
out | app:打开文件时做写操作,在文件尾写入,不清空已经存在的数据;
out | trunc:打开文件时做写操作,删除已经存在的数据,与out模式相同;(之所以相同 是因为默认的构造函数就是用 ios::out|ios|trunc)
in:打开文件时做读操作;
in | out打开文件时做读写操作,并定位于文件的开头处,不清空已经存在的数据;
in | out | trunc:打开文件时做读写操作,删除文件中已经有的数据;
当文件同时以in out模式打开时,不会清空已有数据;
如果只使用了out,而没有指定in模式,则会清空已有数据;
如果使用了trunc,不论是否使用了in,都会清空已有的数据(前提是有ios::out);
ifstream 对象 提供默认 文件模式 ios::in;
ofstream 对象提供默认 文件模式 ios::out|ios::trunc;
fstream 对象不提供默认的 文件模式 因此只能自己敲了;
写文件步骤
1包含头文件
#include <fstream>
2创建流对象
ofstream ofs;
3打开文件
ofs.open("文件路径",打开方式);
4写数据
ofs << "写入的数据";
5关闭文件
ofs.close();
读写操作
- put()
put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。
- get()
get()函数比较灵活,有3种常用的重载形式:
1.一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。
2.另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。
3.还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='/n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'/n'。例如:
file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。
- 读写数据块
要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
read()从文件中读取 num 个字节到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。
例:
unsigned char str1[]="I Love You";
int n[5];
ifstream in("xxx.xxx");
ofstream out("yyy.yyy");
out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中
in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换
in.close();out.close();