std::copy vs std::ifstream::get()



  • Hallo werte Programmierer^^
    Was tut

    std::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.
    Mittels

    file >> 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).


  • Mod

    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ämlich operator>>(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.


Anmelden zum Antworten