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

Write output to new files at every nth 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 是给定的输出文件。我不明白如何 link 包含代码和此可执行命令的文件,因为我需要 5 个不同的新文件(对于 100 次迭代 - 因为数据每 20 次迭代写入一个新文件)。

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

如果我对你的问题的理解正确,那么你是在覆盖 ofstream 而不是附加到它。

您需要在 ofstream 构造函数的模式中指定 'app' 标志:

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

如果您需要从一个新的 "empty" 文件开始输出,只需省略模式(ofstream 默认为 std::ios_base:out,无论您是否指定):std::ofstream::ofstream

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

使用std::stringstream,每次打开都要新建一个文件名。

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

想法是使用字符串流创建(或追加或前置)一个基于 i 的唯一修饰符。 (或任何其他方便的 - 我使用了时间戳)。

我不确定我是否正确理解了你的问题,但我认为你想在新文件中每 20 次迭代输出一次。为此,您只需将 iter 的值附加到文件名或以其他方式向其添加 "dynamic" 元素。

仅使用标准 C++ 的方法是使用字符串流:

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