考虑以下示例代码:
#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
现在使用 clang libc++ 与 gnu libstdc++ 进行测试:
$ 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++ 可以正常工作。
编辑2
使用没有二进制文件的文件也可以正常工作:
ifstream ifs ("testin");
所以肯定有一些可疑的事情发生。看起来这可能是 cin 实现中的问题,而不是迭代器。