1、有三种文件IO流类:fstream、ifstream和ofstream,使用时要包含头文件:#include <fstream>;
2、实际应用中,根据不同的需要选择不同的IO流类。如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入输出方式来打开,就用fstream来定义;
3、打开文件的第一种方式,通过构造函数。即在定义流对象时打开文件,这种模式在定义对象时需传入文件名和打开模式,看一下三种文件IO流类的构造函数定义:
fstream ( const char * filename, ios_base::openmode mode = ios_base::in | ios_base::out );
ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );
ofstream ( const char * filename, ios_base::openmode mode = ios_base::out );
注意看第二个参数都是有默认值的,fstream默认为输入输出方式,ifstream默认为输入方式,ofstream默认为输出方式。所以如果没有特殊的需求,一般可以直接定义一个IO流对象传入要打开的文件名就可以进行IO操作。
4、打开文件的第二种方式,通过成员函数open。这三种文件IO流类都有一个成员函数open,用于打开文件。注意看三个类的open函数的原型:
void fstream::open ( const char * filename, ios_base::openmode mode = ios_base::in | ios_base::out );
void ifstream::open ( const char * filename, ios_base::openmode mode = ios_base::in );
void ofstream::open ( const char * filename, ios_base::openmode mode = ios_base::out );
注意看着三个函数的参数列表与对应类的构造函数一模一样,所以使用起来也是一样的。用这种方式时,先定义一个IO流对象,不传入任何实参,然后再调用open函数,例如打开一个文件进行读操作,代码如下:
ifstream ifs;
ifs.open("filename");
......
5、上面函数的第二个参数“打开模式”在类ios(是所有流式I/O类的基类)中定义,常用的值如下:
ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in: 文件以输入方式打开(文件数据输入到内存)
ios::out: 文件以输出方式打开(内存数据输出到文件)
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
可以用“或”把以上属性连接起来使用,如ios::out | ios::binary.
6、检查打开文件是否成功,或者说文件流是否可用
首先三个类中都提供了good成员函数,判断流是否正常(没有异常);另外还可以直接判断流对象的真假。例如:
fstream fs(...);
if ( fs.good() )
......
ifstream ifs(...);
if ( ifs ) 或者 if ( ifs.good() ),如果要判断ifs无效也可以用 if ( !ifs )
......
7、关闭文件。很简单,没什么好说的,调用成员函数close即可,如:ifs.close()。
8、文件读写。文件读写的方式有很多,常用的有插入器(<<)和析取器(>>),get和put,read和write等,这里不详细介绍,需要用时再补充。
9、getline函数,我自己在做文本分析时经常用到该函数,这里进行说明。
首先看一下该函数的原型:
istream& getline ( istream &is, string &str, char delim );
istream& getline ( istream &is, string &str );
参数:is进行读入操作的输入流,str存储读入的内容,delim为终结符。
说明:该函数将输入流is中读到的字符存入str中,遇到终结符delim才结束。第一个函数delim是可以由用户自己定义的终结符,第二个函数delim默认为 '\n'(换行符)。在遇到终结符delim后,delim会被丢弃,不存入str中。在下次读入操作时,将在delim的下个字符开始读入。函数在输入流is中遇到文件结束符(EOF)或者在读入字符的过程中遇到错误都会结束。
例如要把一个文本文件的内容按行读出来进行处理,一般可以这样写:
ifstream ifs("filename");
string strLine;
while ( getline(ifs, strLine) )
{
......
}
【注意】每次读取到delim后将数据存入到str中,而末尾的delim被丢弃,所以str最后是没有delim的。所以如果将一个文本文件按行读出来,然后输出到屏幕,没输出一行需要自行输出一个endl,如下:
ifstream ifs("filename");
string strLine;
while ( getline(ifs, strLine) )
{
cout << strLine << endl;//需要自行换行
}
10、另外还有文件指针的定位,这里不详细介绍,需要用时再补充。