std::copy vs std::ifstream::get()
-
Hallo werte Programmierer^^
Was tutstd::ifstream file(filename.c_str(),std::ios::binary); std::copy(std::istream_iterator<quint8>(file), std::istream_iterator<quint8>(),std::back_inserter(data)); file.close();anderes als
std::ifstream file(filename.c_str(),std::ios::binary); while(!file.eof()) data.push_back(file.get()); file.close();?
data ist ein std::vector<quint8>.Scheinbar wird die Datei verschieden ausgelesen, denn bei dem Dateiformat welches ich auslas(in die variable "data") ergaben sich an vereinzelten Stellen unterschiede bei der Auswertung, jenachdem ob ich std::copy oder file.get() verwendet habe.
Weiß das jemand adhoc? Könnte auch konkreten Code posten, aber vielleicht reicht das ja schon.
-
Ok, hab es eben selber rausgefunden haha.
Liegt daran, dass std::copy scheinbar die einstellung whitespaces zu ignorieren des filestreams übernimmt.
Mittelsfile >> std::noskipws;ging es dann.
Scheint wohl daran zu liegen das std::copy formatierungen des streams übernimmt und ::get() diese ignoriert(ist ja unformatted data).
-
Der große Unterschied ist, dass du bei deinem copy hier einen istream_iterator benutzt, der ganz was anderes ist als
istream::get. Der nutzt nämlichoperator>>(entsprechender_typ). Mit den von dir beobachteten Konsequenzen bezüglich Whitespaces und auch die Performance wird eine ganz andere sein. Einem get entspräche (ziemlich, aber auch nicht ganz genau) ein istreambuf_iterator. Den kannst du natürlich auch mit copy benutzen. copy ist einfach definiert als (oder äquivalent zu):template<class InputIterator, class OutputIterator> OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result ) { while (first!=last) *result++ = *first++; return result; }
-
Und
while(!file.eof()) data.push_back(file.get());ist auch semantisch falsch - schau dir mal das letzte Zeichen von 'data' an (d.h. Vergleiche die Länge der Originaldatei mit 'data.size()' ;-).
eof() arbeitet nicht vorausschauend, sondern dieses Flag wird erst immer nach einer Leseoperation entsprechend gesetzt.