web-dev-qa-db-ja.com

ifstream seekgの何が問題になっていますか

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

コードは

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

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

19
veda

ファイルの終わりに達したために_ifs >> str;_が終了すると、eofbitが設定されます。

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

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

32
Cubbi

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

6
diverscuba23