Рассмотрим следующий пример кода:Как я могу прочитать 0xFF в файле с libC++ istream_iterator?
#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
Теперь для теста с использованием лязг LibC++ против гну 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++, о которой я должен сообщить? Мои поисковые запросы Google в отношении существующих ошибок ничего не изменили.
2) Есть ли хороший способ обойти эту проблему?
EDIT
Следующий код работает:
#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, но не для итератора.
Попробуйте сделать вывод как 'int (* iit)', также может быть, что cout находится в плохом состоянии после вывода 0xff – PlasmaHH
@PlasmaHH маловероятно; он выводит 'i' с окружающими' endl'. – ecatmur
@PlasmaHH: действительно, не помешало бы '3' выводить bein через' cout' на последней строке? –