22

データをシークして再読み取りしようとしています。しかし、コードは失敗します。

コードは

std::ifstream ifs (filename.c_str(), std::ifstream::in | std::ifstream::binary);

std::streampos pos = ifs.tellg();

std::cout <<" Current pos:  " << pos << std::endl;

// read the string
std::string str;
ifs >> str;

std::cout << "str: " << str << std::endl;
std::cout <<" Current pos:  " <<ifs.tellg() << std::endl;

// seek to the old position
ifs.seekg(pos);

std::cout <<" Current pos:  " <<ifs.tellg() << std::endl;

// re-read the string
std::string str2;
ifs >> str2;

std::cout << "str2: (" << str2.size() << ") " <<  str2 << std::endl;
std::cout <<" Current pos:  " <<ifs.tellg() << std::endl;

私の入力テストファイルは

qwe

出力は

 Current pos:  0
str: qwe
 Current pos:  3
 Current pos:  0
str2: (0)
 Current pos:  -1

誰が何が悪いのか教えてもらえますか?

4

2 に答える 2

38

ifs >> str;ファイルの終わりに達したために終了すると、eofbit を設定します。

C++11 までseekg()は、ストリームの終わりから離れてシークできませんでした (注: 出力が であるため、実際にはそうしますがCurrent pos: 0、それは正確には準拠していません: シークに失敗するか、eofbit をクリアしてシークする必要があります)。

いずれにせよ、それを回避するには、ifs.clear();前に実行できますifs.seekg(pos);

于 2013-05-03T17:22:50.363 に答える
6

文字を読み取る際に EOF に達し、それをストリーム状態でマークしているように見えます。seekg() 呼び出しを実行してもストリームの状態は変更されないため、次の読み取りで EOF ビットが設定されていることが検出され、読み取りを行わずに戻ります。

于 2013-05-03T17:18:30.510 に答える