簡體   English   中英

如何在C或C ++中復制文本文件?

[英]How to copy text file in C or C++?

當試圖將文本文件A復制到另一個文件B時,可能有幾種方法:1)逐字節2)逐字逐句3)逐行

哪一個更有效率?

使用緩沖區:

#include <fstream>

int main()
{
    std::ifstream    inFile("In.txt");
    std::ofstream    outFile("Out.txt");

    outFile << inFile.rdbuf();
} 

C ++ fstream在內部進行緩沖。 他們使用有效的緩沖區大小(盡管人們對流的效率有所說:-)。 所以只需將一個流緩沖區復制到一個流中,然后在內部魔術將一個流的高效副本復制到另一個流。

但是學習使用std :: copy()通過char進行char更加有趣。

只是“緩沖緩沖”,以二進制模式復制文件和讀/寫X字節長部分。 我認為最快的解決方案是使用C語言本身的復制功能或系統調用。

最大的緩沖區將為您提供更少的HDD查找數據操作(更快的復制),但更多的RAM使用。

如果做得好,Byte by byte更有效。 當然,這不是全部故事:它取決於您一次復制多少字節。 如果你逐字節地復制字節,你將為每個字節進行一次I / O調用,最終比字符串庫慢。 大多數人只是猜測一個好的緩沖區大小(通常為2048或更大,為2的倍數)並使用它。

如果你逐字逐行或逐行,你很難重建原始文件,因為有許多形式的換行符(\\ r,\\ n,\\ r \\ n)和空格(\\ p,\\ f,0x32)嵌入在文本文件中,你可能會以這種方式松散。

復制文件的最有效方法是使用字節緩沖區。 緩沖區越大,復制效率越高,只要緩沖區大小不大於硬盤內部緩沖區大小(目前大多數為8mb)。

嘗試使用C ++ iostream和STL。 以下是一個例子:

ifstream infile("to_copy.txt");
if (infile)
{
    istreambuf_iterator<char> ifit(infile);
    ofstream outfile("the_copy.txt");
    ostreambuf_iterator<char> ofit(outfile);
    if (outfile)
    {
        copy(ifit, istreambuf_iterator<char>(), ofit);
        outfile.close();
    }
    else
    {
        cerr << "Could not open output file" << "\n";
    }
    infile.close();
}
else
{
    cerr << "Could not open input file" << "\n";
}

注意 :這可能並不適合所有情況。 根據您的具體要求使用/定制它(例如普通或大量文件)。

我實際上必須自己做同樣的事情,所以我用各種尺寸計時。 我發現,給定一個大文件,所花費的時間幾乎完全取決於我執行了多少I / O(無論其大小如何)。

因此,最好的辦法是盡量減少I / O. 最好是兩個(一個讀取,另一個寫入)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM