C++ 文件和流

  • 文件和流

    到目前为止,我们一直在使用iostream标准库,该库提供cin和cout方法,分别用于从标准输入读取和写入标准输出。本教程将教您如何从文件读取和写入。这需要另一个称为fstream的标准C++库,该库定义了三种新的数据类型-
    • ofstream - 此数据类型表示输出文件流,用于创建文件和将信息写入文件。
    • ifstream - 此数据类型表示输入文件流,用于从文件中读取信息。
    • fstream - 此数据类型通常表示文件流,并且具有ofstream和ifstream的功能,这意味着它可以创建文件,向文件写入信息以及从文件读取信息。
    要在C ++中执行文件处理,标头文件<iostream>和<fstream>必须包含在C++源文件中。
  • 打开文件

    必须先打开文件,然后才能读取或写入文件。无论是ofstream的或fstream的对象可以用来打开文件进行写入。而且ifstream对象用于打开文件仅用于读取目的。以下是open()函数的标准语法,该函数是fstream,ifstream和ofstream对象的成员。
    
    void open(const char *filename, ios::openmode mode);
    
    在这里,第一个参数指定要打开的文件的名称和位置,而open()成员函数的第二个参数定义应打开文件的模式。
    模式 描述
    ios::app 追加模式。该文件的所有输出都将附加到末尾。
    ios::ate 打开文件以输出,并将读/写控件移到文件末尾。
    ios::in 打开文件进行读取。
    ios::out 打开文件进行写入。
    ios::trunc 如果文件已经存在,则在打开文件之前其内容将被截断。
    您可以将这些值中的两个或多个结合在一起,或对其进行“或”运算。例如,如果您想以写入模式打开文件并在已经存在的情况下要截断它,则语法如下-
    
    ofstream outfile;
    outfile.open("file.dat", ios::out | ios::trunc );
    
    类似地,您可以打开文件以进行读写,如下所示:
    
    fstream  afile;
    afile.open("file.dat", ios::out | ios::in );
    
  • 关闭文件

    C++程序终止时,它会自动刷新所有流,释放所有分配的内存并关闭所有打开的文件。但是,程序员应在程序终止前关闭所有打开的文件,这始终是一种好习惯。以下是close()函数的标准语法,该函数是fstream,ifstream和ofstream对象的成员。
    
    void close();
    
  • 写入文件

    在执行C++编程时,您可以使用流插入运算符(<<)将信息从程序写入文件中,就像使用该运算符将信息输出到屏幕上一样。唯一的区别是您使用了一个ofstream或fstream对象而不是cout对象。
  • 从文件读取

    您可以使用流提取运算符(>>)将文件中的信息读取到程序中,就像使用该运算符从键盘上输入信息一样。唯一的区别是您使用了ifstream或fstream对象而不是cin对象。
  • 读写示例

    以下是C++程序,该程序以读写模式打开文件。将用户输入的信息写入名为afile.dat的文件后,程序将从文件中读取信息并将其输出到屏幕上-
    
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    int main () {
       char data[100];
    
       // open a file in write mode.
       ofstream outfile;
       outfile.open("afile.dat");
    
       cout << "Writing to the file" << endl;
       cout << "Enter your name: "; 
       cin.getline(data, 100);
    
       // write inputted data into the file.
       outfile << data << endl;
    
       cout << "Enter your age: "; 
       cin >> data;
       cin.ignore();
       
       // again write inputted data into the file.
       outfile << data << endl;
    
       // close the opened file.
       outfile.close();
    
       // open a file in read mode.
       ifstream infile; 
       infile.open("afile.dat"); 
     
       cout << "Reading from the file" << endl; 
       infile >> data; 
    
       // write the data at the screen.
       cout << data << endl;
       
       // again read the data from the file and display it.
       infile >> data; 
       cout << data << endl; 
    
       // close the opened file.
       infile.close();
    
       return 0;
    }
    
    编译并执行上述代码后,将产生以下示例输入和输出-
    
    $./a.out
    Writing to the file
    Enter your name: Zara
    Enter your age: 9
    Reading from the file
    Zara
    9
    
    上面的示例使用了cin对象中的其他函数,例如getline()函数从外部读取行,而ignore()函数忽略先前的read语句留下的多余字符。
  • 文件位置指针

    istream和ostream都提供了用于重新定位文件位置指针的成员函数。这些成员函数是seekg(“查找获取”)和seekp(“查找放置”)。seekg和seekp的参数通常是一个长整数。可以指定第二个参数来指示查找方向。查找方向可以是ios::beg(默认)相对于流的开始位置定位,ios::cur相对于流的当前位置定位,ios::end相对于流的结束位置定位。文件位置指针是一个整数值,它将文件中的位置指定为文件起始位置的字节数。一些定位“get”文件位置指针的例子是-
    
    // fileObject第n个字节的位置(默认ios::beg)
    fileObject.seekg( n );
    
    // 在fileObject中向前定位n个字节
    fileObject.seekg( n, ios::cur );
    
    // 从fileObject的结束位置返回n个字节
    fileObject.seekg( n, ios::end );
    
    // 位置在文件对象的结束
    fileObject.seekg( 0, ios::end );