在每第n次迭代时将输出写入新文件

时间:2015-04-14 19:12:58

标签: c++ iteration

我的代码片段是:

for (int iter = 0; iter < flags.total_iterations_; ++iter) {
  if (iter%20==0) {
      std::ofstream mf(flags.model_file_.c_str());
 accum_model.AppendAsString(word_index_map, mf); }
   else {
std::cout << "Model not created for "; }
  std::cout << "Iteration " << iter << " ...\n";

所以,我试图在每20次迭代时从方法accum_model生成输出。但是,问题是我必须在每次达到第20次迭代时将输出写入新文件中。现在,我的输出被覆盖了。

我在一个可执行文件的帮助下执行此代码,如下:

 ./lda --num_topics 15 --alpha 0.1 --beta 0.01 --training_data_file testdata/test_data.txt --model_file MF/lda_model.txt --burn_in_iterations 120 --total_iterations 150

MF / lda_model.txt是给定的输出文件。我不知道如何链接包含代码的文件和这个可执行命令,因为我需要5个不同的新文件(100次迭代 - 因为数据每20次迭代写入一个新文件)。

我是编码的新手,到目前为止,我在python中进行编码。我试过这个循环,我很困惑如何创建新文件并获得相应的输出。请帮忙!提前致谢。

3 个答案:

答案 0 :(得分:1)

使用std :: stringstream,并构建一个新文件名以便每次打开。

std::string uniquePathFileNamePostFix (int i) {
   std::stringstream ss;
   ss << '-' << i ;    
   return (ss.str());
}

这个想法是使用stringstream基于i创建(或追加或预先添加)唯一修饰符。 (或其他任何方便的东西 - 我使用过时间戳)。

答案 1 :(得分:0)

如果我正确理解你的问题,你就会覆盖ofstream而不是追加它。

您需要指定“应用”按钮。在ofstream构造函数模式下标记:

std::ofstream mf(flags.model_file_.c_str(), std::ios_base::app);

如果您需要使用新的&#34;空&#34;来启动输出。文件,只是省略模式(ofstream默认为std :: ios_base:out,无论你是否指定):std::ofstream::ofstream

...如果你需要一个新的输出文件(根据你的OP),你需要在flags.model_file _中更改文件名。

答案 2 :(得分:0)

我不确定我是否正确理解了您的问题,但我认为您希望在新文件中输出每20次迭代。为此,您只需将iter的值附加到文件名或以其他方式添加&#34;动态&#34;它的元素。

使用标准C ++的方法是使用stringstream:

    std::stringstream file_name;
    file_name << flags.model_file_ << iter;
    result = file_name.str();