Почему ofstream требует флеш? - PullRequest
7 голосов
/ 18 февраля 2011

Если я запускаю следующий код, файл вообще не создается:

std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);
outputFile.write((const char*)lpResLock, dwSizeRes);
outputFile.close();

Однако, если я добавляю flush () перед закрытием, это работает:

std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);
outputFile.write((const char*)lpResLock, dwSizeRes);
outputFile.flush();
outputFile.close();

Требует ли это стандартная библиотека или это ошибка в CRT Visual C ++?

Ответы [ 2 ]

8 голосов
/ 18 февраля 2011

Это ошибка. Чтение §27.8.1.10 / 4, сокращенно:

void close();
Эффекты: Звонки rdbuf()->close() ...

Что делает rdbuf()->close()? В соответствии с §27.8.1.3 / 6, сокращенно, акцент шахты:

basic_filebuf<charT,traits>* close();
Если is_open() == false, возвращает нулевой указатель. Если существует область размещения, вызывается overflow(EOF) для сброса символов. ...

То есть, предполагается, что флеш. (Действительно, вызов flush() в конечном итоге делает то же самое.)


Обратите внимание, что сам вызов close() не нужен, поскольку деструктор basic_ofstream вызовет close().

0 голосов
/ 18 февраля 2011

Проверяете ли вы файл перед выходом из программы?ОС будет буферизовать все операции ввода-вывода, поэтому перед выходом может не увидеть никаких данных (если вы не очистите их).

...