Zwei zusätzliche Zeichen an Ende der Datei angehängt - wieso?



  • Hallo,

    also folgendes Problem:

    Ich lese ein Zeichen aus einer Datei aus, addiere Beispielsweise 15, schreibe die Datei zurück in eine andere Datei.
    Dann lese ich die Datei wieder, ziehe 15 ab und schreibe sie wieder in eine ander/zurück/egal.

    Letztendlich habe ich 2 Extrazeichen am Schluss (vermutlich eine für jedes Zurückschreiben). Woher kommen die und wie kann ich sie vermeiden?

    (Geschieht unabhängig davon, ob ich im binäry mode öffne oder nicht.)



  • Was für Zeichen sind denn das? Und wie genau sieht deine Kopier-Schleife aus?

    (ich tippe spontan auf einen "eins-daneben-Fehler" - der letzte Lese-Aufruf schlägt fehl und das letzte Zeichen der Eingabedatei wird doppelt verarbeitet)



  • while(dat_in)
            {
                dat_in.read((char*) &c, sizeof(c));
                //... do anything
                dat_out.write((char*) &c, sizeof(c));
            }
    

    Dasselbe hab ich auch mit verschiedenen Datentypen gehabt, etc. etc. also liegt es an dem Schleifenkonstrukt.
    Punkt ist nur: Ich habe das Konstrukt an sich, also read/get, do anything und dann write/put schon mal so ausprobiert, und ach keine Ahnung...



  • #include <algorithm>
    #include <iterator>

    std::copy(std::istream_iterator<char>(data_in), std::istream_iterator<char>(), std::ostream_iteratorchar>(data_out));



  • Und ich habe gewonnen 😃

    Das Eof-Bit wird erst gesetzt, wenn ein Leseversuch fehlgeschlagen ist (also beim dat_in.read()-Aufruf), aber danach erledigst du noch einmal zu viel die gesamten Umrechnungen für das nicht vorhandene Eingabezeichen. Die Lösung lautet: Prüfe den Stream-Status unmittelbar nachdem du ein Zeichen eingelesen hast:

    while(dat_in)
    {
      dat_in.read((char*) &c, sizeof(c));
      if(!dat_in) break;
      //... do anything
      dat_out.write((char*) &c, sizeof(c));
    }
    
    //oder, noch kürzer:
    
    while(dat_in.read((char*)&c, sizeof(c)))
    {
      //... do anything
      dat_out.write((char*) &c, sizeof(c));
    }
    


  • Ah, ok.

    Danke!


Anmelden zum Antworten