【问题标题】:Multiple text files inside two loop两个循环内的多个文本文件
【发布时间】:2019-05-30 20:44:21
【问题描述】:

我想在两个循环中创建一些文件并在不关闭第一个和第二个循环内的文件的情况下填写它们。

在这里,您可以通过查看代码的这一部分来找到我对这个问题的意思,但它不起作用......当然,它会创建 100 个文件,但问题是每个文件只包含最后一次迭代第一个循环,而我希望每个文件都编写第一个循环的整个迭代。

ofstream fout;
for(int t = 0; t < N; t++){
    for(int e = 0; e < 100; e++){
        fout.open("myfile_"+strcpp(e)+".txt");
        fout << t << psi[e] << endl;
    }
}
fout.close();

函数strcpp(e)由下式给出

template <class T>
string  strcpp(T value){
        ostringstream out;
        out << value;
        return out.str();
}

【问题讨论】:

  • 然后把fout.open()放到第二个循环外面。
  • @Michael Chourdakis 它已经在第二个循环之外了!!
  • 一个问题是在知道e 的值之前无法创建文件名。您可能想要交换 for 语句(for e 先出现)。
  • @thomas-matthews 这可能是一个解决方案,但关键是它需要时间,假设N=100000 并且外循环的每次迭代需要 $1min$。

标签: c++


【解决方案1】:

每次调用:

fout.open(...);

文件在打开之前的全部内容都会被删除。由于您多次打开每个文件,因此在写入下一行之前,您会不断擦除您写入的任何内容。这就是为什么外部 for 循环的最后一次写入是每个文件中唯一的内容。 我们可以通过指定我们要附加到我们正在打开的文件来解决这个问题。 std::ofstream::open() 采用指定模式的第二个可选参数。您可以将模式设置为将您在文件中写入的任何内容附加到已经存在的内容的末尾,而不是删除原始文件内容。 例如:

fout.open(my_file_name, ios::app);

虽然更好的解决方案可能是只切换内部和外部 for 循环。然后在内部 for 循环开始之前打开每个文件,对该文件进行所有写入,然后关闭该文件并继续下一个文件。这样您就不必多次打开每个文件。

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多