次のサンプルコードについて考えてみます。
#include <iostream>
using namespace std;
int main()
{
istreambuf_iterator<char> eos;
istreambuf_iterator<char> iit(cin.rdbuf());
int i;
for (i = 0; iit != eos; ++i, ++iit) {
cout << *iit;
}
cout << endl << i << endl;
}
そして、以下を含む入力ファイル: "foo \ xffbar":
$ hexdump testin
0000000 66 6f 6f ff 62 61 72
0000007
ここで、clanglibc++とgnulibstdc++を使用したテストについて説明します。
$ make test
clang++ -std=c++11 -stdlib=libc++ -Wall -stdlib=libc++ -o bug-libcc bug.cpp
clang++ -std=c++11 -stdlib=libc++ -Wall -stdlib=libstdc++ -o bug-libstd bug.cpp
./bug-libcc < testin
foo
3
./bug-libstd < testin
foo�bar
7
ご覧のとおり、libc ++バージョンは、0xffがストリームの終わりであると見なし、読み取りを停止します。したがって、これはいくつかの質問につながります。
1)これは私が報告すべきlibc ++のバグですか?私のグーグル検索で既存のバグは何も見つかりませんでした。
2)この問題を回避する良い方法はありますか?
編集
次のコードが機能します。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream ifs ("testin", ios::binary);
istreambuf_iterator<char> eos;
istreambuf_iterator<char> iit(ifs.rdbuf());
int i;
for (i = 0; iit != eos; ++i, ++iit) {
cout << *iit;
}
cout << endl << i << endl;
}
これはバイナリ変換の問題であると私に信じさせますが、それはlibstdc++が正しく機能する理由を説明していません。
EDIT2
バイナリなしでファイルを使用することも問題なく機能します。
ifstream ifs ("testin");
ですから、間違いなく何か怪しいことが起こっています。ただし、イテレータではなく、cinの実装に問題があるようです。