fstream liest mir ein byte zu viel



  • Hallo!

    Ich habe ein kleines Problem mit fstream in meinem C++ Programm.
    Das Programm selbst tut nicht viel großartiges, es liest eine/zwei Datei/en byteweiße ein und gibt sie wieder als Datei aus.

    Code auszug

    char apath[100], bpath[100], cpath[100];
    ...
    ifstream a; ifstream b; ofstream c;
    a.open(apath, ios::in  | ios::binary);
    b.open(bpath, ios::in  | ios::binary);
    c.open(cpath, ios::out | ios::binary);
    ...
    a.close(); b.close(); c.close();
    

    Aber nun passiert immer folgendes, die Datei auch wenn sie nicht veraendert wieder gespeichert wird, wird immer um ein Byte groesser, am Ende haengt ein sinnloses Byte drinnen, welches mit dem vorherigen Identisch ist. Ich verwende hier die .read(&c,1); und .write(&c,1); Methoden, aber egal was ich mache es passiert immer! Am Code selber liegt das Problem sicher nicht, hat jemand vlt einen Vorschlag wo mein Fehler liegen koennte?

    Danke und LG Harald



  • while (!a.eof()) ...
    

    vielleicht? Ich meine das war der Übeltäter.



  • char ch;
    while (!a.eof()) { a.read(&ch,1); c.write(&ch,1); }
    

    Meinst du daran liegt der Fehler? Ein fail() oder anderer Fehler tritt sicher nicht aus, die eof() Pruefung reicht in meinem Fall.
    Ich habe auch eine andere Moeglichkeit versucht aber das gleiche Problem wie vorher

    char ch;
    for (int i=0; i<dateilaenge; i++) { a.read(&ch,1); c.write(&ch,1); }
    


  • Im ersten Fall ist die Schleifenbedingung falsch gewählt. Erst nach dem ersten erfolglosen a.read() wird a.eof() == true, nicht vorher:

    while (!in.eof()) {
      in.read(&c, 1);   // hier wird erst in.eof = true gesetzt!
      out.write(&c, 1); // c enthaelt das letzte Zeichen, da kein neues gelesen wurde
    }
    

    In deinem zweiten Beispiel testest du vermutlich auf die falsche Dateigröße.
    Allerdings kannst du dir derartige Probleme leicht ersparen:

    #include <fstream>
    
    using namespace std;
    
    int main() {
      ifstream in("test.dat", ios::binary);
      ofstream out("Kopie von test.dat", ios::binary);
    
      out << in.rdbuf();
    }
    


  • Danke 2am

    Oh was für ein dummer Fehler, ich dachte die eof()Prüfung schaut immer das nächste Byte an, nicht das aktuelle! Danke vielmals für die Hilfe!


Anmelden zum Antworten