附加到文本文件在循环中无法正常工作

时间:2018-01-21 22:26:59

标签: c++

以下代码是在运行时被多次调用的函数。该函数包含for loop,其中一些文本被写入stringstream缓冲区。问题是只有来自第一个(或最后一个?)函数调用的数据被输入到文本文件中。我很难找到一种方法让数据附加到文本文件而不会被覆盖,只是以“一个接一个”的方式。

void testItems(const TestObjectList* const testObject) {

      std::stringstream objectOutputBuffer;
      std::ofstream fileOutput("testlog.txt", std::ios_base::app | std::ios_base::out);

      for (itr = testobjects.begin(); itr != testobjects.end(); itr++){

         objectOutputBuffer << some stuff getting written to the buffer in the loop << std::endl;

      }
      fileOutput << objectOutputBuffer.str() << "\n";
      //fileOutput.close();
}

2 个答案:

答案 0 :(得分:2)

您的fileOutput.close()已被注释掉,关闭该文件可能会解决。

尝试执行此操作:

int main() {
        std::ofstream f("f.txt");
        f << "this will be there\n";

        std::ofstream g("f.txt");
        g << "this will not\n";
}

第一个字符串将写入文件但不会写入第二个字符串。

我建议您将std::ofstream fileOutput("testlog.txt", std::ios_base::app | std::ios_base::out)移到函数外部,然后在调用时将fileOutput作为参数传递。

当你完成后记得关闭文件。

答案 1 :(得分:1)

您实际上不需要使用std::ios::out对象指定std::ofstream标志,因为它已默认设置。如果您希望能够追加到文件的末尾,那么您真正需要做的就是设置std::ios::app标志。

std::ofstream fileOutput("testlog.txt", std::ios::app);

虽然我不认为这是你的问题,但换行字符不会刷新你的字符串流缓冲区并强制它写入文件。我建议将"\n"替换为std::endl,这样可以确保刷新缓冲区。