您的位置:首页 > 编程语言 > C语言/C++

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

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

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: