我应该在 C++ 中对 fileIO 使用 string 或 ostringstream 或 stringstream
Should I use string or ostringstream or stringstream for fileIO in C++
我想使用 fstream
s 使用 C++ 写入大文件的开头。
我想出的方法是把整个数据写到一个临时文件,然后写到原文件,再把tmp文件中的数据复制到原文件。
我想创建一个缓冲区,它将数据从原始文件传输到 tmp 文件,反之亦然。
该过程适用于所有人,string
、ostringstream
和 stringstream
。我希望数据复制能够快速进行并且内存消耗最少。
示例 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
还是 ostringstream
或 stringstream
?
使用一个比另一个有什么优势?
不用手动复制,有std::filesystem::copy
.
如果你真的想使用文件流复制,你可以使用一行代码:output_stream << input_stream.rdbuf();
.
如果你真的想用循环手动复制,它不一定是基于行的。使用固定大小的缓冲区。
假设至少有一些操作,并且您没有复制两次相同的数据以以未更改的文件结束,可能的改进(恕我直言)是:
- 不要在循环中使用
std::endl
,而只能使用 '\n'
或 "\n"
。 std::endl
确实写了一个行尾,但也强制对底层流进行刷新,这在循环中是无用且昂贵的。
- 你的代码复制了两次数据。如果可能的话,通过复制(正如您的代码当前所做的那样)构建一个临时文件,然后删除旧文件并使用原始名称重命名临时文件,效率会更高。这样您只需复制一次数据,因为重命名文件是一项成本低廉的操作。
我想使用 fstream
s 使用 C++ 写入大文件的开头。
我想出的方法是把整个数据写到一个临时文件,然后写到原文件,再把tmp文件中的数据复制到原文件。
我想创建一个缓冲区,它将数据从原始文件传输到 tmp 文件,反之亦然。
该过程适用于所有人,string
、ostringstream
和 stringstream
。我希望数据复制能够快速进行并且内存消耗最少。
示例 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
还是 ostringstream
或 stringstream
?
使用一个比另一个有什么优势?
不用手动复制,有std::filesystem::copy
.
如果你真的想使用文件流复制,你可以使用一行代码:output_stream << input_stream.rdbuf();
.
如果你真的想用循环手动复制,它不一定是基于行的。使用固定大小的缓冲区。
假设至少有一些操作,并且您没有复制两次相同的数据以以未更改的文件结束,可能的改进(恕我直言)是:
- 不要在循环中使用
std::endl
,而只能使用'\n'
或"\n"
。std::endl
确实写了一个行尾,但也强制对底层流进行刷新,这在循环中是无用且昂贵的。 - 你的代码复制了两次数据。如果可能的话,通过复制(正如您的代码当前所做的那样)构建一个临时文件,然后删除旧文件并使用原始名称重命名临时文件,效率会更高。这样您只需复制一次数据,因为重命名文件是一项成本低廉的操作。