我的代码片段是:
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中进行编码。我试过这个循环,我很困惑如何创建新文件并获得相应的输出。请帮忙!提前致谢。
答案 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();