在C+中同时向多个文件写入类似内容+; 我正在编写一个C++程序,需要写几百个ASCII文件。这些文件几乎相同。特别是,文件的大小总是完全相同的,它们之间只有几个字符不同

在C+中同时向多个文件写入类似内容+; 我正在编写一个C++程序,需要写几百个ASCII文件。这些文件几乎相同。特别是,文件的大小总是完全相同的,它们之间只有几个字符不同,c++,io,C++,Io,为此,我目前正在使用For循环打开N个文件,然后为每个数据块(每隔几个字符)调用fputc/fwrite。这似乎有效,但感觉应该有更有效的方法 我可以做些什么来减少文件系统的负载和/或提高文件系统的速度吗?例如,让数百个文件保持打开状态并一点一点地写入所有文件对文件系统有多大的负担?如果打开一个文件,写一个完整的,关闭它,然后转到下一个? < p>,如果你考虑上下文切换的成本通常涉及到任何一个系统,那么,你应该“回缩”尽可能多的数据来考虑写入时间和缓冲器的长度。 同时考虑到这主要是一个io驱动的

为此,我目前正在使用For循环打开N个文件,然后为每个数据块(每隔几个字符)调用fputc/fwrite。这似乎有效,但感觉应该有更有效的方法


我可以做些什么来减少文件系统的负载和/或提高文件系统的速度吗?例如,让数百个文件保持打开状态并一点一点地写入所有文件对文件系统有多大的负担?如果打开一个文件,写一个完整的,关闭它,然后转到下一个?

< p>,如果你考虑上下文切换的成本通常涉及到任何一个系统,那么,你应该“回缩”尽可能多的数据来考虑写入时间和缓冲器的长度。
同时考虑到这主要是一个io驱动的问题,可能是一个发布子体系结构,其中发布者缓冲数据,供您提供给执行io工作的任何订阅者(并且还等待底层存储机制就绪)如果你认为上下文切换的代价通常涉及到任何一个子系统,那么是的,你应该“尽可能多”地考虑到写入时间和缓冲器的长度。
同时考虑到这主要是一个io驱动的问题,可能是一个发布子体系结构,其中发布者缓冲数据,供您提供给执行io工作的任何订阅者(并且还等待底层存储机制就绪)这可能是一个不错的选择。

您可以只对一个文件写入一次,然后复制该文件。您可以阅读有关如何制作副本的内容

这是上面链接中的示例代码,介绍了如何在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;
}

您可以只对一个文件写入一次,然后复制该文件。您可以阅读有关如何制作副本的内容

这是上面链接中的示例代码,介绍了如何在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;
}

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

如果不对您的特定系统进行基准测试,我猜——这可能是您能得到的最好结果——一次写入一个文件比打开丢失的文件并将数据写入多个文件要好。毕竟,准备内存中的数据是一个小细节,写入文件是一个“漫长的过程”。

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

我还尝试使用流而不是fputc,但fputc的速度似乎是前者的两倍


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

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

我还尝试使用流而不是fputc,但fputc的速度似乎是前者的两倍


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

这完全取决于您的操作系统、设置、使用的文件系统以及可能更多的方面。最后,数据无论如何都需要多次写入,除非您有一个可以重用块的文件系统。这些文件是用于Web服务器还是类似的东西?如果是这样,那么在请求时动态生成内容如何?不,不幸的是,它们需要提前生成。这完全取决于您的操作系统、设置、使用的文件系统以及可能更多的内容。最后,数据无论如何都需要多次写入,除非您有一个可以重用块的文件系统。这些文件是用于Web服务器还是类似的东西?如果是这样的话,那么在请求时动态生成内容如何?不,很遗憾,它们需要提前生成。文件之间的字符差异如何?这看起来像c#(不是c++)。@hmjd如果他特别知道应该更改哪些字符,他可以手动更改。正如OP所说,“只有几个字符”。如果你不确定是C#还是C++的话,请检查链接。谢谢你的建议。实际上,我曾经考虑过类似的事情(多次复制同一个文件,然后使用fseek和fputc编辑文件),但这似乎有点“危险”,因为您需要在文件中的位置和字符串中的位置之间进行转换。但是如果其他方法不起作用,我可能会重新考虑这个问题@NILS是的,这可能会导致混乱,但你可能会尝试使用一些技巧,MB一些标志标识你必须修改的值……即使这实际上是C++,它看起来也不太像。在C++中,您将使用STD::string,而不是模糊的字符串*。这看起来像是一个只使用microsoft Windows的解决方案,但相当糟糕。文件之间的字符差异如何?这看起来像c#(不是c++)。@hmjd如果他特别知道应该更改哪些字符,他可以手动更改。正如OP所说,“只有几个字符”。如果你不确定是C#还是C++的话,请检查链接。谢谢你的建议。实际上我是