流到缓冲区工作,文件到缓冲区不起作用



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

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

如果要直接使用std::filebuf,则需要使用 std::filebuf::sgetn() .这样做并没有多大意义,因为无论如何std::ifstream::read()实际上只会打电话给std::filebuf::sgetn()

相关内容

  • 没有找到相关文章

最新更新