C++ - ofstream doesn't output to file until I close the program

Bender the Greatest picture Bender the Greatest · Mar 9, 2012 · Viewed 7k times · Source

I have the following code:

   ofstream mOutFile.open(logPath, ios_base::app);
   string lBuilder;

   lBuilder.append("========================================================\n");
   lBuilder.append("Date: ");
   lBuilder.append(asctime(timeinfo));
   lBuilder.append("\n");
   lBuilder.append("Log Message:\n");
   lBuilder.append(toLog);
   lBuilder.append("\n");
   lBuilder.append("========================================================\n\n");

   int lSize = lBuilder.size();
   char* lBuffer = new char[lSize];
   int index = 0;
   for each (char c in lBuilder)
      lBuffer[index++] = c;

   mOutFile.write(lBuffer, lSize);
   mOutFile.flush();

Unfortunately, until I close the app (I assume that closing the ofstream would work as well) the output does not get written to the text file. I know I could probably close and reopen the stream and everything will "just work" but that seems like a silly and incorrect solution. What am I doing wrong here?

I have also tried the following variations based on other questions I have found here, but these solutions did not work:

mOutputFile << flush;
mOutputFile << endl;

Thanks in advance for any assistance on this.

edit Everything in this code is working visual c++, it builds and works fine except the file is not written to until the stream is closed, even if I force a flush. Also, I switched from using the << operator to the char * and .write () to see if anything behaved differently.

Answer

111111 picture 111111 · Mar 9, 2012
std::ofstream file(logPath, ios_base::app);

file << "========================================================\n"
     << "Date: " << asctime(timeinfo)
     << "\nLog Message:\n" << toLog
     << "\n========================================================\n\n"
     << std::flush; 
     //if you want to force it write to the file it will also flush when the the file object is destroyed
//file will close itself

This is not only easier to read but it will probably also be faster than your method + it is a more standard appraoch