Problem bei gleichzeitigem Lesen und Schreiben in Binärdateien



  • Hallo,
    ich bin neu hier und das ist mein erster Beitrag und ich hoffe,
    dass ich nicht irgendwo eine passende Antwort überlesen habe 😉

    Ich habe ein kleines Progrämmchen geschrieben, dass das gleichzeitige Lesen und Schreiben in einer Binärdatei demonstrieren soll.
    Es werden Zahlen in eine Binärdatei geschrieben und zur Kontrolle ausgegeben.
    Die Datei wird dann zum Lesen und Schreiben geöffnet, die Zahlen werden gelesen und bei geraden Zahlen wird der "Dateizeiger" zurückgesetzt und die Zahl mit einer um Eins größeren Zahl überschrieben.
    Danach sollten in der Datei nur noch ungerade Zahlen sein.
    Problem: Nach dem die erste gerade Zahl ersetzt wurde, bricht das Programm ab und ich sehe einfach nicht warum. Nach der write Anweisung ist der Stream auf eof.
    Wenn ich nach der write-Anweisung die (eigentlich sinnlose??) Anweisung
    ausein.seekp(0,ios::cur); setze, die doch wohl bedeutet "bleib wo du bist", läuft das Programm problemlos.
    Kann mir jemand dieses Verhalten erklären oder sieht, wo mein Denkfehler liegt?

    Im folgenden Quelltext habe ich die Kontrollen, ob die Streams geöffnet werden konnten und weggelassen. Ich benutze Code::Blocks 10.05 mit GNU Compiler unter Win 7

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    using namespace std;
    int main()
    {
       int zahl=0;
       ofstream aus;
       ifstream ein;
       fstream ausein;
       aus.open("zahlen.dat",ios::binary);//---Zahlen in Datei schreiben
       for(int i=0;i<10;i++)
          aus.write((char*)&i,sizeof(int));
       aus.close();
    
       ein.open("zahlen.dat",ios::binary);//-- Zahlen aus Datei ausgeben
       while( ein.read((char*)&zahl,sizeof(int)) )cout<<zahl<<",";
       ein.close();
    
       ausein.open("zahlen.dat",ios::in|ios::out|ios::binary);//Lesen und Schreiben
       while(ausein.read((char*)&zahl,sizeof(int)))
       {
          if(zahl%2==0) //wenn gerade
          {
             zahl++;  // dann jetzt ungerade
             ausein.seekp((-1*(ios::pos_type)sizeof(int)),ios::cur); //zurueck gehen
             ausein.write((char*)&zahl,sizeof(int)); //Zahl ueberschreiben
             //ausein.seekp(0,ios::cur); //damit funktioniert es ?????
          }
       }
       ausein.close();
       cout<<endl<<"nach bearbeiten: "<<endl; //Kontrollausgabe ---
       ein.clear();
       ein.open("zahlen.dat",ios::binary);
       while( ein.read((char*)&zahl,sizeof(int)) )cout<<zahl<<",";
          ein.close();
    
       system("Pause");
       return(0);
    }
    

    Schon mal danke für die Mühe
    Gruß
    pitzelpatz


  • Mod

    Kann ich nicht nachvollziehen, funktioniert bei mir. Habe jedoch auch ein reines Linux. Vielleicht irgendein komischer Effekt den man nur in Windows sieht? Ich sehe aber gerade keine Stelle, an der etwas schiefgehen könnte.



  • Hallo SeppJ,

    SeppJ schrieb:

    Kann ich nicht nachvollziehen, funktioniert bei mir. Habe jedoch auch ein reines Linux. Vielleicht irgendein komischer Effekt den man nur in Windows sieht? Ich sehe aber gerade keine Stelle, an der etwas schiefgehen könnte.

    Du hast recht. Es scheint am Compiler zu liegen.
    Mit Code::Blocks 10.05 und seinem default GNU Compiler läuft das Programm auf meinem Win7 64Bit PC, auf meinem Win7 64Bit Laptop
    und in einer virtuellen Umgebung mit Win7 32 Bit nicht und bricht wie beschrieben ab.
    Wenn ich das Programm mit der Orwell Dev-Cpp Umgebung und dessen
    TDM-GCC 4.61 64 Bit Compiler laufen lasse, funktioniert es tadellos.
    Das Verhalten ist aber trotzdem komisch, oder?

    Vielen Dank, ich habe schon echt an meinem Verstand gezweifelt.

    Gruß
    Pitzelpatz


Anmelden zum Antworten