![](/img/trans.png)
[英]C++ Int to String by using ostringstream or stringstream
[英]Should I use string or ostringstream or stringstream for fileIO in C++
我想使用fstream
s 使用 C++ 寫入大文件的開頭。
我想出的方法是把整個數據寫到一個臨時文件中,然后寫到原始文件中,再把tmp文件中的數據復制到原始文件中。
我想創建一個緩沖區,它將數據從原始文件帶到 tmp 文件,反之亦然。
該過程適用於所有string
、 ostringstream
和stringstream
。 我希望數據復制能夠快速進行,並且消耗最少的 memory。
帶有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::endl
,而只能使用'\n'
或"\n"
。 std::endl
確實寫了一個行尾,但也強制對底層 stream 進行刷新,這在循環中是無用且昂貴的。 您不需要手動復制,有std::filesystem::copy
。
如果你真的想使用文件流進行復制,你可以使用一行代碼: output_stream << input_stream.rdbuf();
.
如果你真的想用循環手動復制,它不必是基於行的。 使用固定大小的緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.