C++利用缓冲区来提高读写文件的效率

在C++中,涉及文件读写的主要类包括ifstream、ofstream 和 fstream。这些类都位于 `<fstream>` 头文件中,并提供了各种方法来进行文件读写操作。

1. ifstream(input file stream):用于从文件中读取数据。
   - 打开文件:`ifstream file("filename");`
   - 检查文件是否成功打开:`if (!file) { /* 处理打开文件失败的情况 */ }`
   - 读取文件内容:`file >> variable;` 或 `getline(file, line);`
   - 关闭文件:`file.close();`

2. ofstream(output file stream):用于向文件中写入数据。
   - 打开文件:`ofstream file("filename");`
   - 检查文件是否成功打开:`if (!file) { /* 处理打开文件失败的情况 */ }`
   - 写入数据到文件:`file << data;`
   - 关闭文件:`file.close();`

3. fstream(file stream):同时支持读写操作,可以用于读取和写入文件。
   - 打开文件:`fstream file("filename");`
   - 检查文件是否成功打开:`if (!file) { /* 处理打开文件失败的情况 */ }`
   - 读取文件内容:`file >> variable;` 或 `getline(file, line);`
   - 写入数据到文件:`file << data;`
   - 关闭文件:`file.close();`

以上是文件读写类的基本用法,通过这些类和对应的方法,可以实现对文件的读取和写入操作。在使用这些类时,需要注意文件打开成功与否的检查,以及在使用完文件后关闭文件流,释放资源。


-------------------------------
file.rdbuf()->pubsetbuf(buffer, buffer_size);
这行代码用于设置文件流对象 file 的缓冲区大小和位置。

  • file.rdbuf() 返回文件流对象 file 所关联的底层缓冲区指针(streambuf),它是用于管理输入输出的基础设施。
  • pubsetbuf(buffer, buffer_size) 是 streambuf 类的成员函数,用于设置缓冲区的大小和位置。它接受两个参数:一个指向字符数组的指针 buffer,和缓冲区的大小 buffer_size

这行代码的目的是将文件流对象 file 的缓冲区设置为大小为 buffer_sizebuffer 数组,以便在写入大量数据时提高效率。通过设置缓冲区,可以减少对底层操作系统的频繁调用,将数据先缓存到内存中,然后批量写入文件,从而提高了写入的效率。

#include <iostream>
#include <fstream>
#include <string>

int main() {

    const int buffer_size = 1024; // 设置缓冲区大小为1KB
    char buffer[buffer_size]; // 定义缓冲区数组

    std::ofstream file("C++_large_output.txt");
    if (!file) {
        std::cerr << "Error opening file for writing." << std::endl;
        return 1;
    }

    // file.rdbuf() 返回文件流对象 file 的指针指向的基础缓冲区(streambuf),它是用于管理输入输出的基础设施。
    // -> 是C++中用于访问对象的成员(成员函数、成员变量)的运算符,通常用于访问指针所指向对象的成员。
    file.rdbuf()->pubsetbuf(buffer, buffer_size); // 设置文件流对象 file 的缓冲区的大小和位置的

    // 写入大量数据到文件
    for (int i = 0; i < 10000; i++) {
        file << "Line " << i << std::endl;
    }

    file.close();



    // 创建了一个名为 file 的文件输入流对象,并打开了名为 "C++_large_output.txt" 的文本文件
    std::ifstream file2("C++_large_output.txt");
    if (!file2) {
        std::cerr << "Error opening file." << std::endl;
        return 1;
    }

    std::string line;
    int line_count = 0; // 计数器

    while (std::getline(file2, line)) {
        // 打印前100行文本
        if (line_count < 100) {
            std::cout << line << std::endl;
            line_count++;
        } else {
            break; // 达到100行后退出循环
        }
    }

    file.close();

    return 0;
}

 

相关推荐

  1. C++利用缓冲区提高文件效率

    2024-04-13 05:42:01       14 阅读
  2. c++文件

    2024-04-13 05:42:01       36 阅读
  3. C++文件

    2024-04-13 05:42:01       46 阅读
  4. 如何利用ChatGPT提高编程效率

    2024-04-13 05:42:01       44 阅读
  5. [C#]文件-1

    2024-04-13 05:42:01       37 阅读
  6. C++二进制文件

    2024-04-13 05:42:01       8 阅读
  7. C++BMP文件

    2024-04-13 05:42:01       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-13 05:42:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-13 05:42:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 05:42:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 05:42:01       20 阅读

热门阅读

  1. SpringBoot初始化工程

    2024-04-13 05:42:01       18 阅读
  2. 常见的分类算法介绍

    2024-04-13 05:42:01       18 阅读
  3. 图论中的模板

    2024-04-13 05:42:01       17 阅读
  4. LeetCode:1两数之和 C语言

    2024-04-13 05:42:01       12 阅读
  5. 软考之零碎片段记录(十三)+复习巩固(八)

    2024-04-13 05:42:01       14 阅读
  6. nodejs安装及环境配置

    2024-04-13 05:42:01       16 阅读
  7. 链表题(哑结点的使用)

    2024-04-13 05:42:01       14 阅读
  8. Photoshop小记

    2024-04-13 05:42:01       18 阅读
  9. CentOS版本不同大小的各个版本区别

    2024-04-13 05:42:01       15 阅读