代码之家  ›  专栏  ›  技术社区  ›  user297850

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

c c++
  •  5
  • user297850  · 技术社区  · 14 年前

    1) 逐字节 2) 逐字逐句 3) 逐行

    哪一个更有效?

    6 回复  |  直到 14 年前
        1
  •  19
  •   Loki Astari    14 年前

    使用缓冲区:

    #include <fstream>
    
    int main()
    {
        std::ifstream    inFile("In.txt");
        std::ofstream    outFile("Out.txt");
    
        outFile << inFile.rdbuf();
    } 
    

    但是学习使用std::copy()逐个字符地完成它要有趣得多。

        2
  •  4
  •   Piotr Müller    14 年前

    只需“一个缓冲区接一个缓冲区”,以二进制模式复制文件并读/写X字节长的部分。我认为最快的解决方案是使用C语言本身的复制函数或系统调用。

        3
  •  0
  •   wds    14 年前

    如果做得好,逐字节更有效。当然,这不是全部:这取决于你一次复制多少字节。如果按字面意思逐字节复制,则会对每个字节执行I/O调用,结果会比字符串库慢。大多数人只是猜测一个好的缓冲区大小(通常是2048或更大,2的倍数)并使用它。

        4
  •  0
  •   codymanix    14 年前

    如果逐字或逐行执行,则很难重建原始文件,因为文本文件中嵌入了多种形式的换行符(\r、\n、\r\n)和空格(\p、\f、0x32),您可能会以这种方式丢失它们。

    复制文件最有效的方法是使用字节缓冲区。缓冲区越大,复制的效率就越高,只要缓冲区大小不超过硬盘内部缓冲区大小(目前主要是~8mb)。

        5
  •  0
  •   celavek    14 年前

    尝试使用C++ IoSokes和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";
    }
    

    :这可能不适用于所有情况。根据您的具体要求(如普通文件或大型文件)使用/定制。

        6
  •  -2
  •   T.E.D.    14 年前

    因此,最好的办法是尽可能少地执行I/O操作。最好两个(一个读,另一个写)。