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.