现在的位置: 首页 > 综合 > 正文

C++常用的读写文件操作

2012年02月23日 ⁄ 综合 ⁄ 共 2466字 ⁄ 字号 评论关闭

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、另外还有文件指针的定位,这里不详细介绍,需要用时再补充。
         




抱歉!评论已关闭.