文件流:以文件为输入输出对象的流
#include<fstream>
一、文件操作打开一个输入或输出文件
1.打开一个输出文件
ofstream fout;
fout.open("1.txt");
2.打开一个输入文件
ifstream fin;
fin.open("2.txt");
3.打开一个文件,既可以输入也可以输出
fstream finout;
finout.open("3.txt");
更便捷方式 ofstream fout("1.txt"); ifstream fin("2.txt"); fstream finout("3.txt"); 不指定路径就在默认的项目文件中
二.文件的输入,输出
1.>> ,<< 方式
fout<< “hello world";
char ch;
fin>>ch;
操纵符 功能 输入/输出
dec 格式化为十进制数值数据 输入和输出
endl 输出一个换行符并刷新此流 输出
ends 输出一个空字符 输出
hex 格式化为十六进制数值数据 输入和输出
oct 格式化为八进制数值数据 输入和输出
setpxecision(int p) 设置浮点数的精度位数 输出
例如:要把123当作十六进制输出:file1<<hex<<123;要把3.1415926以5位精度输出:file1<<setpxecision(5)<<3.1415926。
2.函数形式
1)fout.put(ch) 输出一个字符
2)get()函数比较灵活,有3种常用的重载形式:
1)fin.get(ch) 取出一个字符存储在成中,或者ch=fin.get();功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符while(fin.get(ch))检测是否读到文件尾
2)ifstream &get(char *buf,int num,‘\n‘‘);这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符‘‘\n‘‘。 例如:
file2.get(str1,127,‘A‘);//从文件中读取字符到字符串str1,当遇到字符‘‘A‘‘或读取了127个字符时终止。
3) getline :fin.getline(buf,80); //前提char buf[80];
读写数据块
要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
4)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();
三.关闭文件
fin.close();
四.检测文件是否打开成功
if(fin.fail())
if(!fin.good())
if(!fin)
括号内为真,则打开失败
五、检测EOF
成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();
例:if(in.eof())ShowMessage("已经到达文件尾!");
六、随机读取文件
seekg()输入指针移动到指定位置,seekp()输出指针移动到指定位置,用app的话,seekp方法会失效
fin.seekg(streamoff offset,seek_dir origin);
offset 一般是字节数;
seek_dir origin : ios::beg 开始位置
ios::cur 当前位置
ios::end 文件结尾
fin.seekg(字节数);移动到第字节数+1的位置