在C ++中一次将类似内容写入多个文件

时间:2013-07-04 12:14:06

标签: c++ io

我正在开发一个需要编写数百个ASCII文件的C ++程序。这些文件几乎完全相同。特别是,文件的大小总是完全相同,它们之间只有很少的字符。

为此,我正在打开带有for循环over fopen的N个文件,然后在每个文件上为每个数据块(每隔几个字符)调用fputc / fwrite。这似乎有效,但感觉应该有一些更有效的方式。

我能做些什么来减少文件系统的负载和/或提高速度吗?例如,文件系统如何对数百个文件打开并一点一点地写入所有文件?打开一个文件,完全写一个文件,关闭它然后再转到下一个文件会不会更好?

4 个答案:

答案 0 :(得分:1)

如果考虑上下文切换的成本通常涉及执行任何这些系统调用,那么是的,你应该“尽可能地回顾”尽可能多的数据,考虑到写入时间和缓冲区的长度。

还有一个事实是,这主要是一个io驱动的问题,可能是一个pub子架构,其中发布者缓冲数据,让你给任何做io工作的用户(并且还等待底层存储机制准备就绪) )可能是一个不错的选择。

答案 1 :(得分:1)

您只需对一个文件编写一次,然后复制该文件即可。您可以阅读有关如何制作副本here

的信息

这是上层链接的示例代码,如何在C ++中执行:

int main() {
    String* path = S"c:\\temp\\MyTest.txt";
    String* path2 = String::Concat(path, S"temp");

    // Ensure that the target does not exist.
    File::Delete(path2);

    // Copy the file.
    File::Copy(path, path2);
    Console::WriteLine(S"{0} copied to {1}", path, path2);
return 0;
}

答案 2 :(得分:1)

如果没有对您的特定系统进行基准测试,我会GUESS - 这可能是您能得到的最好 - 一次编写文件比打开文件丢失和将数据写入多个文件更好。毕竟,在内存中准备数据是一个小细节,写入文件是“漫长的过程”。

答案 3 :(得分:0)

我现在已经做了一些测试,看起来,至少在我的系统上,并行写入所有文件比一个接一个地写入它们慢约60%(263s对比100个文件乘以165,000个100000000个字符)。

我也尝试使用ofstream而不是fputc,但fputc的速度似乎快了两倍。

最后,我可能会继续做我目前正在做的事情,因为重写我的代码一次写一个文件的复杂性不值得提高性能。