0
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()失敗するのですか?

4

1 に答える 1

3

seekg()+によって返される値はtellg()、ファイルがバイナリ モードで開かれている場合にのみ信頼できます。テキスト モードでは行末が変換され、オペレーティング システムがファイルを保存する方法によって結果が異なります。

具体的には、Windows では CR+LF のペアが 1 文字に変換され'\n'ます。

于 2012-06-14T19:00:54.633 に答える