fstream到缓冲区工作,filebuf到缓冲区没有

时间:2014-01-07 22:24:09

标签: c++ stream

我正在尝试将我的代码从std :: fstream转换为std :: 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是相同的,dataBuf s返回相同的字符串。我应该执行任何其他功能吗?

1 个答案:

答案 0 :(得分:4)

pubsetbuf()的调用对你没有多大帮助。唯一需要的行为是stream->pubsetbuf(0, 0)使文件缓冲区无缓冲,而您几乎肯定不需要。如果参数为非null,它不会保证会发生什么。特别是,它不保证正在使用的缓冲区是通过的缓冲区!事实上,如果任何实现都使用用户提供的缓冲区,我会感到惊讶。即使使用了缓冲区,文件缓冲区也没有理由将代码实际放入缓冲区!至少你需要拨打电话std::filebuf::underflow(),例如从缓冲区读取内容。

如果您想直接使用std::filebuf,则需要使用std::filebuf::sgetn()。这样做并没有多大意义,因为std::ifstream::read()无论如何都会有效地呼叫std::filebuf::sgetn()