C 高性能文件读写(C 14)

新手上路,请多包涵

我正在编写一个 C++14 程序来从文件加载文本字符串,对它们进行一些计算,然后写回另一个文件。我使用的是 Linux,文件比较大(O(10^6 行))。我的典型方法是使用旧的 C getlinesscanf 实用程序来读取和解析输入,并 fprintf(FILE*, …) 来写入输出文件。这行得通,但我想知道是否有更好的方法来实现高性能目标,并且通常推荐使用我正在使用的现代 C++ 标准的方法。我听说 iostream 很慢;如果这是真的,我想知道是否有更推荐的方法。

更新:澄清一下用例:对于输入文件的每一行,我将进行一些文本操作(数据清理等)。每条线都是独立的。因此,加载整个输入文件(或者,至少是其中的大块),并逐行处理它,然后编写它,似乎是最有意义的。对此的理想抽象是获取读入缓冲区的迭代器,每一行都是一个条目。有没有推荐的使用 std::ifstream 的方法?

原文由 Kulluk007 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 873
1 个回答

如果您有足够的内存,最快的选择是通过 1 次读取将整个文件读入缓冲区,在内存中处理缓冲区,然后通过 1 次写入再次将其全部写出。

全部阅读:

 std::string buffer;

std::ifstream f("file.txt");
f.seekg(0, std::ios::end);
buffer.resize(f.tellg());
f.seekg(0);
f.read(buffer.data(), buffer.size());

然后处理它

然后全部写出来:

 std::ofstream f("file.txt");
f.write(buffer.data(), buffer.size());

原文由 David 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题