2014-01-07 93 views
1

我想我的代碼的std :: fstream的轉換到std :: filebuf:fstream的緩衝作品,filebuf緩衝不

fstream的版本(原文):

std::ifstream stream(file); 
stream.seekg(0,std::ios::end); 
size_t fileSize = stream.tellg(); 
char * dataBuf = new char[fileSize]; 

stream.seekg(0); 
stream.read(dataBuf, fileSize); 

LoadData(dataBuf); 

filebuf版本(轉換):

std::filebuf * stream = new std::filebuf; 
stream->open(file, std::ios::in); 
size_t fileSize = stream->pubseekoff(0, std::ios::end); 
char * dataBuf = new char[fileSize]; 

stream->pubseekpos(0); 
stream->pubsetbuf(dataBuf, fileSize); 
LoadData(dataBuf); 

filebuf版本似乎沒有得到加載。我不知道我錯過了什麼,因爲fileSize s是相同的,並且dataBuf s返回相同的字符串。我應該執行其他功能嗎?

回答

4

pubsetbuf()的呼叫肯定不會對你有太大的好處。唯一需要的行爲是stream->pubsetbuf(0, 0)使文件緩衝區無緩衝,這幾乎可以肯定不需要。它不保證如果參數非空,會發生什麼情況。特別是,它不保證正在使用的緩衝區是正在傳遞的緩衝區!事實上,如果任何實現使用用戶提供的緩衝區,我會感到驚訝。即使使用了緩衝區,文件緩衝區也沒有任何理由給出實際將任何東西放入緩衝區的代碼!至少您需要撥打電話std::filebuf::underflow(),例如從緩衝區中讀取某些內容。

如果您想直接使用std::filebuf,則需要使用std::filebuf::sgetn()。沒有太多的意義,因爲std::ifstream::read()無論如何只會有效地撥打std::filebuf::sgetn()