C++中的文件和流
C++中把文件看成是字节序列,即由一个个字节顺序组成。每个文件以结束符(EOF)结束,这种文件称为流式文件。可以把C++的文件看成是一个字符串。只不过这个字符串不是存放在内存中,而是存放在外存中。不是以‘\0’结尾,而是用EOF结尾。当打开一个文件时,该文件就和某个流关联起来。
c++中文件访问过程
- 定义一个流对象(为文件找一个代理)
- 打开文件:将流对象与文件关联起来(确定文件与流对象的代理关系)
- 访问文件:和控制台访问类似,可以使用<<或>>操作
- 关闭文件 :切断流对象与文件的关联(流对象与该文件没有关系,流对象可以再与其他文件关联起来
文件流类型
- ifstream:输入文件流(类似cin)
- ofstream:输入文件流(类似cout)
- ifstream:输入文件流(类似cin+cout)
文件打开方式
- 用流对象的成员函数open打开文件
- 用流对象的构造函数打开文件
无论是成员函数open还是通过构造函数,都有两个参数:(1)打开的文件名;(2)文件打开模式(想对文件做什么操作)
三种流类型都有默认打开方式:
ifstream流对象是以in模式打开(前提是文件必须存在)
ofstream流关联的文件默认以out模式打开(如果文件存在,清空文件中内容后在写入。如果文件不存在,建立文件并写入内容)
fstream流对象以in和out方式打开。
//打开输入文件:
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);
关闭文件
使用成员函数close()关闭文件与流对象直接的连接。对于输出文件,close会将缓冲区中的内容写入文件,main函数执行结束时,会关闭所有打开的文件,但最好是使用完文件后用close函数关闭文件。
文件顺序访问
C++ ASCII文件的读写和控制台读写一样,
- 可以用流提取运算符“>>”从文件读数据,用流插入运算符”<<”将数据写入文件。
- 可以用文件流的其他成员函数读写文件,如get函数,put函数等。
- 可以使用无格式化输入输出函数read和write读文件和写文件。
判断文件结束的方式:
- 若使用>>读:可以通过判断输入流对象值是否为0(不是指不能读数字0哦,只是说infile>>n的结果是0表示结束)
- get读:判断读入字符是否是EOF
- 其他方式读:通过成员函数eof。eof函数不需要参数,返回一个整型值。当读操作遇到文件结束时,该函数返回1,否则返回0。
注意:>>读取数据时以空格来判断数据之间的界限,比如 1 2 203 三个数据,读取后是“1”、“2”、“203”
文件的随机访问
1.文件定位指针(存储在输入/输出流对象中,个人感觉和迭代器或句柄类似)
是一个long类型的数据 ,指出当前读写的位置。C++文件有两个定位指针:读指针和写指针。当文件以输入方式打开时,读指针指向文件中的第一个字节。文件以输出方式打开时,写指针指向文件中的第一个字节。当文件以添加方式打开时,写指针指向文件尾。
2.获取文件定位指针的当前位置
成员函数tellg(读文件定位指针相关)和tellp(写文件定位指针相关)
streamoff offsetIn=ifile.tellg(); //返回当前读文件指针的位置
streamoff offsetOut=ofile.tellp();//返回当前写文件指针的位置
3.移动文件指针的函数
seekg(ifstream中用)和seekp(ofstream中用)都有两个参数:第一个参数通常为long类型的整数,表示偏移量(字节);第二个参数指定移动的起始位置
- 第二个参数可选方式:
ios::beg(默认):相对于流的开头 //如果函数只有一个参数,那就是默认使用相对流的开头
ios::cur:相对于流当前位置
ios::end:相对于流结尾
ifile.seekg(10) //等同于ifile.seekg(10,ios::beg) 将读文件指针移动到距离文件开头10个字节处
4.无格式化输出输出
read函数
成员函数read可实现无格式输入。它有两个参数。第一个参数是一个指向字符的指针,第二个参数是一个整型值。这个函数把一定量的字节从输入缓冲区读入字符数组,不管这些字节包含的是什么内容。
char buffer[20];
ifile.read(buffer, 10);//从ifile文件中读出10个字节,从buffer地址开始处放
如果还没有读到指定的字符数,遇到了EOF,则读操作结束。此时可以用成员函数gcount统计输入的字符个数
write函数
成员函数write()可以实现无格式化输出。它有两个参数。第一个参数是一个指向字符的指针,第二个参数是一个整型值。这个函数是把一定量的字节从字符数组中输出到文件。这些字节都是未经任何格式化的,仅仅是以原始数据形式输出。
char buffer[]="happy birthday";
ofile.write(buffer,10);//输出buffere中10个字节到ofile中