gpt4 book ai didi

c++ - fstream 缓冲有效,filebuf 缓冲无效

转载 作者:行者123 更新时间:2023-11-30 01:55:07 30 4
gpt4 key购买 nike

我正在尝试将我的代码从 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) 使文件缓冲区无缓冲,这几乎肯定是您不想要的。它不保证参数为非空时会发生什么。特别是,它不能保证正在使用的缓冲区就是正在传递的缓冲区!事实上,如果任何实现使用用户提供的缓冲区,我都会感到惊讶。即使使用了缓冲区,文件缓冲区也没有理由将任何内容实际放入缓冲区!至少您需要调用 std::filebuf::underflow(),例如,从缓冲区中读取一些内容。

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

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com