我应该在 C++ 中对 fileIO 使用 string 或 ostringstream 或 stringstream

Should I use string or ostringstream or stringstream for fileIO in C++

我想使用 fstreams 使用 C++ 写入大文件的开头。
我想出的方法是把整个数据写到一个临时文件,然后写到原文件,再把tmp文件中的数据复制到原文件。

我想创建一个缓冲区,它将数据从原始文件传输到 tmp 文件,反之亦然。
该过程适用于所有人,stringostringstreamstringstream。我希望数据复制能够快速进行并且内存消耗最少。

示例 string:

void write(std::string& data)
{
    std::ifstream fileIN("smth.txt");
    std::ofstream fileTMP("smth.txt.tmp");
    std::string line = "";

    while(getline(fileIN, line))
        fileTMP << line << std::endl;

    fileIN.close();
    fileTMP.close();

    std::ifstream file_t_in("smth.txt.tmp"); // file tmp in
    std::ofstream fileOUT("smth.txt");
    fileOUT << data;

    while(getline(file_t_in, line)
        fileOUT << line << std::endl;

    fileOUT.close();
    file_t_in.close();

    std::filesystem::remove("smth.txt.tmp");
}

我应该使用 string 还是 ostringstreamstringstream

使用一个比另一个有什么优势?

不用手动复制,有std::filesystem::copy.

如果你真的想使用文件流复制,你可以使用一行代码:output_stream << input_stream.rdbuf();.

如果你真的想用循环手动复制,它不一定是基于行的。使用固定大小的缓冲区。

假设至少有一些操作,并且您没有复制两次相同的数据以以未更改的文件结束,可能的改进(恕我直言)是:

  • 不要在循环中使用 std::endl,而只能使用 '\n'"\n"std::endl 确实写了一个行尾,但也强制对底层流进行刷新,这在循环中是无用且昂贵的。
  • 你的代码复制了两次数据。如果可能的话,通过复制(正如您的代码当前所做的那样)构建一个临时文件,然后删除旧文件并使用原始名称重命名临时文件,效率会更高。这样您只需复制一次数据,因为重命名文件是一项成本低廉的操作。