Rudhra
Rudhra

Reputation: 284

Write output to new files at every nth iteration

A fragment of my code is :

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";

So, I am trying to generate outputs from method accum_model at every 20th iteration. But, the problem is I have to write the output in new file everytime the 20th iteration is reached. Now, my output is being overwritten.

I execute this code with the help of a executible, which is as:

 ./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

The MF/lda_model.txt is the output file given. I am not understanding how to link the file that contains the code and this executible command as I would need 5 different new files (for 100 iterations - as data is written into a new file every 20th iteration).

I am new to coding and so far, I was coding in python. I tried till this loop, I am confused about how to create new files and get corresponding outputs. Please help! Thanks in advance.

Upvotes: 1

Views: 955

Answers (3)

lz1irq
lz1irq

Reputation: 1

I'm not sure that I understand your question correctly, but I think you want to output every 20th iteration in a new file. To do so, you just need to append the value of theiter to the name of the file or otherwise add a "dynamic" element to it.

The way to do it using only standard C++ is using stringstream:

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

Upvotes: 0

2785528
2785528

Reputation: 5576

Use std::stringstream, and build a new file name to open each time.

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

The idea is to use the stringstream to create (or append or prepend) a unique modifier based on i. (or anything else convenient - I have used time stamps).

Upvotes: 1

hEADcRASH
hEADcRASH

Reputation: 1915

If I understand your question correctly, you are overwriting the ofstream instead of appending to it.

You'll want to specify the 'app' flag in the mode of the ofstream constructor:

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

If you need to start the output with an new, "empty" file, just leave out the mode (ofstream defaults to std::ios_base:out, whether you specify it or not): std::ofstream::ofstream

...and if you need a new output file (according to your OP), you need to change the file name in flags.model_file_.

Upvotes: 0

Related Questions