繁体   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