我正在尝试将我的代码从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返回相同的字符串。我应该执行其他功能吗?

最佳答案

调用pubsetbuf()肯定对您没有多大帮助。唯一需要的行为是stream->pubsetbuf(0, 0)使文件缓冲区成为无缓冲的,而您几乎肯定不希望这样做。它不能保证如果参数为非null会发生什么。特别是,它不能保证所使用的缓冲区就是传递的缓冲区!实际上,如果有任何实现使用用户提供的缓冲区,我会感到惊讶。即使使用了缓冲区,文件缓冲区也没有理由将代码实际放入缓冲区中!至少您需要引起一个调用std::filebuf::underflow(),例如,从缓冲区中读取内容。

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

关于c++ - fstream缓冲工作,filebuf缓冲不,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20983221/

10-11 22:36
查看更多