ifstream.read() 设置如果读取量小于可用值则失败位

ifstream.read() sets fail bit if reading less than available

本文关键字:失败 小于 read 设置 读取 如果 ifstream      更新时间:2023-10-16
std::ifstream sr(path.c_str());
if (!sr)
    throw runtime_error("Could not open file '"+path+"'");
sr.seekg(0, ios::end);
streampos lastPos = sr.tellg(); //returns 3161125
unsigned dataSize = (int)lastPos - 100; //dataSize becomes 3161025
char* data = (char*)malloc(dataSize);
if (!data)
    throw runtime_error("Out of memory whean allocating read buffer");
sr.clear();
sr.seekg(0, ios::beg);
sr.read(data, dataSize);  //sr.read(data, 3110000) works!
if(sr.fail()) //fails

这段代码失败,但是如果我读取 3110000 字节,则read()成功,fail() false。我可以通过这样的流迭代器加载文件:

string data(std::istreambuf_iterator<char>(sr),
            std::istreambuf_iterator<char>());

知道为什么read()失败吗?

仅当文件以二进制模式打开时,seekg() + tellg() 返回的值才可靠。在文本模式下,将翻译行尾,根据操作系统存储文件的方式,结果会有所不同。

具体来说,在Windows上,CR + LF对被转换为单个字符'n'