如果读取少于可用,则ifstream.read()设置失败位

时间:2012-06-14 18:52:11

标签: c++ std

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()失败的原因吗?

1 个答案:

答案 0 :(得分:3)

seekg() + tellg()返回的值仅在文件以二进制模式打开时才可靠。在文本模式下,行结尾会被转换,结果会有所不同,具体取决于操作系统存储文件的方式。

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