2013-10-24 7 views
5

次のプログラムは、libC++とlibstdC++(clang3.3を使用)間のstd :: getlineの動作に不一致があることを示しています。clang 3.3/Xcode&libC++:ifstream :: clear()を呼び出した後にstd :: getlineがデータを読み込まない

プログラムはtestfileファイルを開き、eofまで読み取り、ifstream :: clearを使用してエラービットをクリアし、同じファイルハンドルから新しいデータがファイルに追加されたかどうかを再試行します。 libstdC++(関係なく、コンパイラ)を使用して

#include <fstream> 
#include <iostream> 
#include <unistd.h> 

using namespace std; 

int main() { 
    ifstream* file = new ifstream("testfile"); 
    if (! file->is_open()) { 
     cout << "testfile does not exist" << endl; 
     return -1; 
    } 

    while (1) { 
     file->clear(); // remove end of file evil bits 
     string line; 

     // workaround: 
     // file->seekg(file->tellg()); 

     while (getline(*file, line)) 
      cout << "read line: " << line << endl; 

     if (file->eof()) 
      cout << "File reports eof after getline\n"; 

     usleep(1000000); 
    } 
} 

あなたがプログラムの実行中にTESTFILEにデータを追加すると、データは次のループ反復でのgetline呼び出しによって読み込まれます。

libC++を使用したOS-X上のclang 3.3では、ファイルの最後に達した後、ファイルに追加されたデータを読み取ることなく、getlineは常に失敗し、以降のすべての呼び出しでeofビットを設定します。現在の位置を探している回避策のコメントを外すと、libstdC++の動作が復元されます。 clang ++ -stdlib = libstdC++でlibstdC++をコンパイルすると、古い動作に戻ります。

これが予想される変更であることは誰にも分かりますか?私はサポートされていない方法でこれをやろうとしていますか、現在のlibC++バージョンのいくつかの問題ですか?

私にとっては、この動作をトリガー打ち鳴らすのバージョンはマーベリックスのためのXCodeに同梱され、最新のものである:

Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.0.0 
Thread model: posix 

のlibC++にリンクされているライブラリは、このバージョン情報を持っています

/usr/lib/libc++.1.dylib: 
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) 
/usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 48.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
+0

おそらくバグは 'libC++'ライブラリに対して報告されるべきです。それは私のバグのようです。 –

+0

私はlibC++ bugtrackerに提出しました。[link](http://llvm.org/bugs/show_bug.cgi?id=17688) –

答えて

2

ifstreamの内部バッファを外部デバイスと同期させるには、

関連する問題