Si consideri il seguente codice di esempio:Come posso leggere un 0xFF in un file con 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;
}
E un file di input contenente quanto segue: "foo \ xffbar":
$ hexdump testin
0000000 66 6f 6f ff 62 61 72
0000007
Ora, per il test utilizzando clang libC++ vs 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
Come si può vedere la versione di libC++ pensa che 0xff sia la fine del flusso e smette di leggere. Quindi questo porta a un paio di domande.
1) Si tratta di un bug in libC++ che dovrei segnalare? Le mie ricerche su google per bug esistenti non hanno trovato nulla.
2) C'è un buon modo per ovviare a questo problema?
EDIT
Il seguente codice funziona:
#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;
}
mi porta a credere che si tratta di un problema di conversione binaria, ma questo non spiega perché libstdC++ funziona correttamente.
EDIT2
Utilizzando un file senza binario funziona bene troppo:
ifstream ifs ("testin");
Quindi non v'è sicuramente qualcosa di sospetto. Sembra che potrebbe essere un problema nell'implementazione di cin, non l'iteratore.
provare a eseguire l'output come 'int (* iit)', potrebbe anche essere che cout si trova in uno stato non valido dopo l'emissione 0xff – PlasmaHH
@PlasmaHH improbabile; sta emettendo 'i' con il' endl's circostante. – ecatmur
@PlasmaHH: davvero, non impedirebbe che '3' venga trasmesso tramite' cout' sull'ultima riga? –