我正在尝试将代码从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 version (转换):
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版本似乎没有加载。我不知道我错过了什么,因为fileSizes是相同的,并且dataBufs返回相同的字符串。我还需要执行什么额外的功能吗?
发布于 2014-01-08 06:29:01
对pubsetbuf()的调用肯定不会对您有多大好处。惟一需要的行为是stream->pubsetbuf(0, 0)将文件缓冲区设为无缓冲,这几乎肯定不是您想要的。它不保证参数为非空时会发生什么。特别是,它不能保证正在使用的缓冲区就是被传递的缓冲区!事实上,如果有任何实现使用用户提供的缓冲区,我会感到惊讶。即使使用了缓冲区,文件缓冲区也没有理由使用给定的代码将任何内容实际放入缓冲区!至少,您需要调用std::filebuf::underflow(),例如,从缓冲区读取某些内容。
如果你想直接使用std::filebuf,你需要使用std::filebuf::sgetn()。这样做并没有多大意义,因为不管怎样,std::ifstream::read()实际上只是调用std::filebuf::sgetn()。
https://stackoverflow.com/questions/20983221
复制相似问题