1.C++中的文件和流
C++中把文件看成是字节序列,即由一个个字节顺序组成。每个文件以结束符(EOF)结束,这种文件称为流式文件。可以把C++的文件看成是一个字符串。只不过这个字符串不是存放在内存中,而是存放在外存中。不是以‘\0’结尾,而是用EOF结尾。当打开一个文件时,该文件就和某个流关联起来。
2.c++中文件访问过程
- 定义一个流对象(为文件找一个代理)
- 打开文件:将流对象与文件关联起来(确定文件与流对象的代理关系)
- 访问文件:和控制台访问类似,可以使用<<或>>操作
- 关闭文件 :切断流对象与文件的关联(流对象与该文件没有关系,流对象可以再与其他文件关联起来
3.文件流类型
- ifstream:输入文件流(类似cin)
- ofstream:输出文件流(类似cout)
- fstream:输入输出文件流
4.文件打开方式
- 用流对象的成员函数open打开文件
- 用流对象的构造函数打开文件
如果文件打开失败,返回0
无论是成员函数open还是通过构造函数,都有两个参数:
- 打开的文件名
- 文件打开模式(想对文件做什么操作)
三种流类型都有默认打开方式:
- ifstream流对象是以in模式打开ifstream流对象是以in模式打开
- ifstream流对象是以in模式打开
- ifstream流对象是以in模式打开ifstream流对象是以in模式打开
//打开输入文件:
ifstream infile;
infile.open(“file1”); 或 infile.open(“file1”, ifstream::in);
也可以利用构造函数直接打开:
ifstream infile(“file1”); 或 ifstream infile(“file1” , ifstream::in);
//打开输出文件
ofstream outfile;
outfile.open(“file2”); 或 outfile.open(“file2”, ofstream::out);
也可以利用构造函数直接打开:
ofstream outfile(“file2”); 或 ofstream outfile(“file2” , ofstream::out);
//打开输入输出文件
fstream iofile(“file3”);
fstream iofile(“file3”, fstream:: in | fstream::out);
5.关闭文件
使用成员函数close()关闭文件与流对象直接的连接。对于输出文件,close会将缓冲区中的内容写入文件,main函数执行结束时,会关闭所有打开的文件,但最好是使用完文件后用close函数关闭文件。
6.文件顺序访问
C++ ASCII文件的读写和控制台读写一样,可以用流提取运算符“>>”从文件读数据,也可以用流插入运算符”<<”将数据写入文件,也可以用文件流的其他成员函数读写文件,如get函数,put函数等。
判断文件结束的方式:
- >>读:可以通过判断输入流对象值是否为0(不是指不能读数字0哦,只是说infile>>n的结果是0表示结束)
- get读:判断读入字符是否是EOF
- 其他方式读:通过成员函数eof。eof函数不需要参数,返回一个整型值。当读操作遇到文件结束时,该函数返回1,否则返回0。
注意:>>读取数据时以空格来判断数据之间的界限,比如 1 2 203 三个数据,读取后是“1”、“2”、“203”
7.文件的随机访问
- 文件定位指针(存储在输入/输出流对象中,个人感觉和迭代器或句柄类似)
文件定位指针:是一个long类型的数据 ,指出当前读写的位置。C++文件有两个定位指针:读指针和写指针。当文件以输入方式打开时,读指针指向文件中的第一个字节。文件以输出方式打开时,写指针指向文件中的第一个字节。当文件以添加方式打开时,写指针指向文件尾。
2.获取文件定位指针的当前位置 :成员函数tellg(读文件定位指针相关)和tellp(写文件定位指针相关)
seekg和seekp都有两个参数:第一个参数通常为long类型的整数,表示偏移量(字节);第二个参数指定移动的起始位置
- 寻找方向:
ios::beg(默认):相对于流的开头 //如果函数只有一个参数,那就是默认使用相对流的开头
ios::cur:相对于流当前位置
ios::end:相对于流结尾
3.设置文件定位指针的位置:成员函数seekg和seekp