3

私は 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++ の不一致を報告している投稿がいくつか見つかりましたが、私のものとは異なります。

誰かが私のものと同じ問題に遭遇しましたか。それを解決するための一般的な解決策はありますか?いくつかの汚い回避策を想像することはできますが、使用したくありません。

助けてくれてありがとう

4

1 に答える 1

1

謝罪いたします。これはlibc++のバグです。これはlibc++svnパブリックトランクで修正されていますが、修正には再コンパイルされたlibc ++。dylibが必要です。これは、当然のことながらOSX10.8.yには存在しません。

llvm svnサーバーは現在ダウンしていますが、修正は単にeofをチェックすることだったと思いますbasic_istream<_CharT, _Traits>::peek()

+            if (traits_type::eq_int_type(__r, traits_type::eof()))
+                this->setstate(ios_base::eofbit);

すでに推測しているように、回避策は、ピーク後の正確なeofチェックに依存しないことです。

于 2013-01-04T04:04:05.747 に答える