シークしてデータを再度読み取ろうとしています。しかし、コードは失敗します。
コードは
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
誰が何が悪いのか教えてもらえますか?
ファイルの終わりに達したために_ifs >> str;
_が終了すると、eofbitが設定されます。
C++ 11までは、seekg()
はストリームの終わりからシークできませんでした(注:出力は_Current pos: 0
_であるため、実際にはそうしますが、厳密に準拠しているわけではありません。シークするか、eofbitをクリアしてシークする必要があります)。
いずれにせよ、それを回避するには、ifs.clear();
の前にifs.seekg(pos);
を実行します
EOF=をヒットしている文字を読み取り、ストリーム状態にマークを付けているように見えます。seekg()呼び出しを実行してもストリーム状態は変更されないため、次の読み取りでは、 EOFビットが設定され、読み取りなしで戻ります。