C ++ - ofstream не выводит в файл, пока я не закрою программу - PullRequest
5 голосов
/ 10 марта 2012

У меня есть следующий код:

   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();

К сожалению, пока я не закрою приложение (я предполагаю, что закрытие ofstream также будет работать), вывод не записывается в текстовый файл. Я знаю, что мог бы, вероятно, закрыть и снова открыть поток, и все будет «просто работать», но это кажется глупым и неправильным решением. Что я тут не так делаю?

Я также попробовал следующие варианты, основанные на других вопросах, которые я нашел здесь, но эти решения не сработали:

mOutputFile << flush;
mOutputFile << endl;

Заранее благодарим за любую помощь в этом.

edit Все в этом коде работает на Visual C ++, он собирается и работает нормально, за исключением того, что файл не записывается до тех пор, пока поток не будет закрыт, даже если я вызову сброс. Кроме того, я переключился с использования оператора << на char * и .write (), чтобы посмотреть, ведет себя ли что-то по-другому. </p>

Ответы [ 3 ]

8 голосов
/ 10 марта 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

Это не только легче читать, но и, вероятно, будет быстрее, чем ваш метод + это более стандартная оценка

1 голос
/ 12 марта 2012

В итоге я просто "заставил это работать", закрыв и снова открыв поток после операции записи.

mOutputFile << "all of my text" << endl;
mOutputFile.close();
mOutputFile.open(mLogPath);

EDIT После попытки принудительного сброса в некоторых других системахПохоже, что что-то просто не работает правильно на моей машине для разработки.Не очень хорошие новости, но, по крайней мере, вышеупомянутое решение работает, когда программная очистка потока не удалась.Я не уверен в последствиях приведенного выше кода, поэтому, если кто-то захочет принять участие, если есть последствия закрытия и повторного открытия потока следующим образом.

0 голосов
/ 24 мая 2018

Вы можете выполнить следующие шаги для проверки некоторых предположений:

1.) После flush() изменения в файле должны быть видны вашему приложению .Откройте файл как std::fstream вместо std::ofstream.После очистки сбросьте указатель файла на начало и прочитайте содержимое файла. Ваша вновь записанная запись должна быть там. Если нет, возможно, у вас где-то в коде повреждение памяти.

2.) Откройте тот же файл в std::ifstream после вашего вызоваflush().Затем прочитайте содержимое файла. Ваша вновь записанная запись должна быть там. Если нет, то, вероятно, существует другой процесс, мешающий вашему файлу.

Если оба сработают, то вы можете прочитать о «блокировке файлов» и«межпроцессная синхронизация».Операционная система (теоретически) может занять столько времени, сколько она хочет, чтобы изменения файла были видны другим процессам.

...