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

Kul*_*007 1 c++ io

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

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

Kar*_*ari 6

如果你有C++17(std::filesystem),也有这种方法(通过std::filesystem::file_size而不是seekg和tellg获取文件的大小)。我想这可以让你避免阅读两次

在这个答案中显示了


Dav*_*vid 5

如果你有内存,最快的选择是将整个文件读入一个缓冲区,读取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());
Run Code Online (Sandbox Code Playgroud)

然后处理它

然后全部写下来:

std::ofstream f("file.txt");
f.write(buffer.data(), buffer.size());
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个“勇敢”的答案,而不知道文件的绝对大小和可用内存...... (3认同)
  • 如果文件足够大,并且物理内存的内存压力很高,则此代码将从磁盘读取文件两次. (2认同)
  • 抱歉@David 这一切都很好,但不可移植:您无法保证由 `tellg()` 返回的 `streampos` 将符合 `resize()` 所期望的 `string::size_type` - [Demo ](https://ideone.com/4KTqWt) (2认同)
  • @Christophe 随意添加 numeric_limits 检查 (2认同)