C++文本文件的读写操作

计算机上的文件其实是数据的集合,对文件的读写归根结底还是对数据的读写操作。

文件可以大致分为两种,分别是文本文件和二进制文件:
  • 文本文件中的每一个字节存放的都是一个 ASCII 码,代表一个字符;
  • 二进制文件是将内存中的数据按照其在内存中的存储形式原样存放在磁盘上。

文本文件用记事本打开,显示的是字符,如下面左图,而用记事本打开一个二进制文件则显示的是一堆乱码,如下面右图所示。

        

举个例子:
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int A[ 3 ][ 10 ];
    int i, j;
    ifstream input( "input.txt", ios::in );
    if( ! input )
    {
        cerr << "Open input file error!" << endl;
        exit( -1 );
    }
    ofstream output( "output.txt", ios::out );
    if( ! output )
    {
        cerr << "Open output file error!" << endl;
        exit( -1 );
    }
    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; j++ )
        {
            input >> A[ i ][ j ];
        }
    }
    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; j++ )
        {
            cout << A[ i ][ j ] <<" ";
        }
        cout << endl;
    }
    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; j++ )
        {
            output << A[ i ][ j ] <<" ";
        }
        output << "\r\n";
    }   
    input.close();
    output.close();
    return 0;
}
我们通过此程序来介绍文本文件的读写,先来看一下头文件,因为程序中使用了 cout 和 cerr 对象,因此必须包含<iostream>头文件。此外,文件操作还需要引入<fstream>头文件。

在主函数中,我们先来看一下文件打开操作。ifstream 类和 ofstream 类中都有一个 open() 成员函数,它可以用类的对象调用。open() 函数有两个参数,第一个参数是需要打开的文件名,这个参数可以是字符指针、字符数组或 string 类型,第二个参数是输入输出格式。下表列出了一些输入输出格式。

格式 用途
ios::in 以输入方式打开文件
ios::out 以输出方式打开文件,如果文件不存在则新建,如果文件存在就将其原有内容全部清空
ios::app 输出的数据追加到文件末尾
ios::ate 打开一个文件,并将指针定位到文件末尾
ios::trunc 打开一个文件,如果文件不存在则新建,如果存在,则清空原有文件中的内容
ios::binary 以二进制方式打开文件,如果不指定则默认采用文本方式打开文件
ios::in | ios::out 以输出和输入方式打开文件
ios::in | ios::binary 以输入方式打开一个二进制文件
ios::out| ios::binary 以输出方式打开一个二进制文件
 
open() 函数如果打开失败则返回 0,也即 false,否则返回一个非零值。当然 ifstream 类和 ofstream 类中的构造函数中已经包含了 open() 函数的功能,因此为了方便,我们通常会在创建对象时就将参数列出,利用带参数的构造函数打开文件,本例中使用的就是这种方式。例如ifstream input("input.txt", ios::in );,我们通常都会使用这种方式,因为这种方式方便。

在程序中,我们检测了文件是否打开成功,如果打开成功则对象创建成功,为一个非 0 值。打开文件后处理完数据需要关闭文件,我们直接用对象调用 close() 函数就可以了。

对文本文件的读写操作有两种方式:
  • 使用输入输出操作符“<<”、“>>”;
  • 使用 put()、get()、getline() 等函数进行操作。

第二种方式是使用函数,但这些函数只是能用于处理字符,对于其它数据类型则有些有心无力了,为此还是建议使用第一种方式,因为第一种方式重载了输入输出操作符,它可以处理所有内建数据类型。在本例中也是使用第一种方式处理整型数据。

从实例中我们也可以看到,文件输入和输出与标准输入输出的使用方法其实是一样的,只不过是将类对象由 cout 和 cin 换成了 ofstream 类和 ifstream 类的对象。在示例程序中,我们先是从 input.txt 文件中读取数据存入到数组 A[3][10] 中,然后再将 A[3][10] 数组中的数据打印到显示器,之后再将数据写入到 output.txt 文件中。