次のプログラムは、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)
おそらくバグは 'libC++'ライブラリに対して報告されるべきです。それは私のバグのようです。 –
私はlibC++ bugtrackerに提出しました。[link](http://llvm.org/bugs/show_bug.cgi?id=17688) –