Tein ensimmäistä kertaa ohjelman, jossa käsittelen binääritiedostoja ja heräsi kysymys. Alla koodi, joka lukee komentoriviparametrina annettua tiedostoa tavu kerrallaan ja kirjoittaa sitä samalla toiseen tiedostoon:
#include <fstream> #include <string> using namespace std; int main(int argc, char* argv[]) { ifstream in(argv[1], ifstream::in|ifstream::binary); string strout(argv[1] + ".out"); strout += ".out"; ofstream out(strout.c_str(), ofstream::out|ofstream::binary); char tmp; while ( in >> tmp ) { out << tmp; } in.close(); out.close(); return 0; }
Tuo siis toimii muuten nätisti, paitsi jos tiedostossa sattuu olemaan whitespace-merkkejä. Esimerkiksi välilyönnin (0x20) tullessa vastaan ifstreamin >>-operaattori hyppää seuraavaan merkkiin ja jättää välilyönnin lukematta kokonaan. Ongelman voi toki kiertää hoitamalla lukemisen seuraavalla tavalla:
tmp = in.peek(); in.ignore(1);
Mutta tuntuu jotenkin hölmöltä, että >>-operaattori toimii tuolla lailla. Voiko sen jotenkin estää?
EDIT: Vai pitäisikö binääriä luettaessa käyttää mieluummin jotain muuta ifstreamin metodia?
>> operaattori jättää välilyönnit, tabulaattorit ja rivinvaihdot pois.
Toisin sanoen tarkoitukseen sopivat funktiot ovat get ja put tai sitten read ja write. Katso c++:n feferenssi.
Ok, tattis.
Aihe on jo aika vanha, joten et voi enää vastata siihen.