2011-02-18 89 views
6

如果我運行下面的代碼,沒有文件是在所有已創建:爲什麼ofstream需要刷新?

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

是否標準庫實際上需要這個,還是它在Visual C++ CRT中的錯誤?

+3

什麼版本的Visual Studio? – GManNickG 2011-02-18 02:11:12

回答

8

這是一個錯誤。讀數§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

您是否在退出程序之前檢查該文件?操作系統將緩衝所有IO,因此在退出之前可能看不到任何數據(除非您刷新)。