• 【C++上层应用】5. 文件和流


    • 和 iostream 库中的 cin 标准输入流和 cout 标准输出流类似,C++中另一个库 fstream 也存在文件的读取流和标准写入流。
    • fstream 库 定义了三个新的数据类型:
    数据类型描述
    ifstream该数据类型表示输入文件流,用于 从文件读取信息
    ofstream该数据类型表示输出文件流,用于 创建文件并向文件写入信息
    fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以 创建文件,向文件写入信息,从文件读取信息
    • 要在 C++ 中进行 文件处理,必须在 C++ 源代码文件中包含头文件

    【 1. 打开文件 】

    • 在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。

    1.1 open 函数

    • open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员函数,标准语法如下:
    void open(const char *filename, ios::openmode mode);
    /*
    open() 成员函数的第一参数指定要打开的文件的名称和位置,
    第二个参数定义文件被打开的模式。
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    open函数模式标志描述
    ios::app追加模式。所有写入都追加到文件末尾。
    ios::ate文件打开后定位到文件末尾。
    ios::in打开文件用于读取。
    ios::out打开文件用于写入。
    ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
    • 实例
      以读取模式打开文件
    fstream MyReadFile;
    MyReadFile.open("file.dat", ios::in )	
    
    • 1
    • 2

    1.2 open 多种模式的结合使用

    • 当我们想要以写入模式打开文件,并希望截断文件,以防文件已存在,如下所示:
    ofstream outfile;
    outfile.open("file.dat", ios::out | ios::trunc );
    
    • 1
    • 2
    • 类似地,如果想要打开一个文件用于读写,如下所示:
    ifstream  afile;
    afile.open("file.dat", ios::out | ios::in );
    
    • 1
    • 2

    【 2. 关闭文件 】

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

    【 3. 写入 & 读取文件 】

    • 在 C++ 编程中,我们 使用流插入运算符 << 向文件写入信息 ,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里我们使用的是 ofstream 或 fstream 对象,而不是 cout 对象。
    • 在 C++ 编程中,我们 使用流提取运算符 >> 从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里我们使用的是 ifstream 或 fstream 对象,而不是 cin 对象。
    • 实例:
      以读写模式打开一个文件。在向文件 afile.dat 写入用户输入的信息之后,程序从文件读取信息,并将其输出到屏幕上。
      实例中使用了 cin 对象的附加函数,比如 getline()函数从外部读取一行,ignore() 函数会忽略掉之前读语句留下的多余字符。
    #include 
    #include 
    using namespace std;
    
    int main ()
    {
    
       char data[100];
    
       // 以写模式打开文件
       ofstream outfile;
       outfile.open("afile.dat");
    
       cout << "Writing to the file" << endl;
       cout << "Enter your name: "; 
       cin.getline(data, 100);
    
       // 向文件写入用户输入的数据
       outfile << data << endl;
    
       cout << "Enter your age: "; 
       cin >> data;
       cin.ignore();
    
       // 再次向文件写入用户输入的数据
       outfile << data << endl;
    
       // 关闭打开的文件
       outfile.close();
    
       // 以读模式打开文件
       ifstream infile; 
       infile.open("afile.dat"); 
    
       cout << "Reading from the file" << endl; 
       infile >> data; 
    
       // 在屏幕上写入数据
       cout << data << endl;
    
       // 再次从文件读取数据,并显示它
       infile >> data; 
       cout << data << endl; 
    
       // 关闭打开的文件
       infile.close();
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    在这里插入图片描述

    【 4. 文件位置指针 】

    • istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数包括关于 istream 的 seekg(“seek get”)和关于 ostream 的 seekp(“seek put”)。
    • 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 的末尾
    fileObject.seekg( 0, ios::end );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    进程关系~
    DGIOT边缘主机-Linux版操作手册
    学单片机有前途吗?
    【Unity】U3D TD游戏制作实例(四)建造防御塔:防御塔生成器、一个int代表多选框,圆上任意点位的坐标计算、制作防御塔预制件
    transformer架构中 encoder decoder self-attention cross-attention的作用
    从零开始的Django框架入门到实战教程(内含实战实例) - 11 利用echart和Ajax请求完成数据可视化(学习笔记)
    java运算符
    【ES6闯关】Promise堪比原生的自定义封装then、catch、resolve、reject...
    lotus 存储数据 2k 本地测试网
    leetcode 90双周赛
  • 原文地址:https://blog.csdn.net/qq_44431690/article/details/134526892