私は Mac OSX 10.8.1 (Mountain Lion) を使用しています: Apple clang バージョン 4.1 (tags/Apple/clang-421.11.66) (LLVM 3.1svn に基づく) - 最新版が利用可能です。
libc++ std::istream::peek() を使用した Clang は、eof 検出に関して正しく動作しないようです。libstdc++ では問題は発生しません。
以下の簡単な例では、std ライブラリのバージョンに応じて異なる結果が得られます。
test.cpp:
#include <iostream>
#include <sstream>
void printstat(std::istream& data) {
std::cout << "flags: eof: " << data.eof() << "; good: " << data.good() << "; bad: " << data.bad() << " fail: " << data.fail() << std::endl;
}
int main() {
std::stringstream data("a");
printstat(data);
while (data.good()) {
char a = data.get();
std::cout << "get(): " << a << std::endl;
printstat(data);
data.peek();
std::cout << "peek()" << std::endl;
printstat(data);
std::cout << std::endl;
}
return 0;
}
「clang++ -stdlib=libstdc++ test.cpp」でコンパイルされたファイルからの出力 (これは正しいようです):
flags: eof: 0; good: 1; bad: 0 fail: 0
get(): a
flags: eof: 0; good: 1; bad: 0 fail: 0
peek()
flags: eof: 1; good: 0; bad: 0 fail: 0
「clang++ -stdlib=libc++ test.cpp」でコンパイルされたファイルからの出力 (これは私には正しくないようです):
get(): a
flags: eof: 0; good: 1; bad: 0 fail: 0
peek()
flags: eof: 0; good: 1; bad: 0 fail: 0
get(): ?
flags: eof: 1; good: 0; bad: 0 fail: 1
peek()
flags: eof: 1; good: 0; bad: 0 fail: 1
この問題の最も簡単な回避策は、libc++ の代わりに libstdc++ を使用することです。残念ながら、いくつかの c++11 機能を使用する必要があるため、libc++ が唯一の解決策です。
eof ビットの動作で libc++ と libstdc++ の不一致を報告している投稿がいくつか見つかりましたが、私のものとは異なります。
誰かが私のものと同じ問題に遭遇しましたか。それを解決するための一般的な解決策はありますか?いくつかの汚い回避策を想像することはできますが、使用したくありません。
助けてくれてありがとう