Leerzeilen in Datei



  • Hallo @all,
    meine Funktion soll mir in einer .txt Datei ein paar Zeilen löschen.
    Das funktioniert auch gut, jedoch werden beim erneuten Schreiben der Datei komische Zeichen am Anfang eingefügt, sowie am Ende der Datei immer 2 Leerzeichen gepostet.

    Könnte mir bitte jemand sagen warum das so ist und wie ich es beheben könnte?

    Gruss Michael

    int deleteBuch(char* ID) {
    fstream fileReadBuch;
    char Text[512];
    char Buffer[512];
    
        fileReadBuch.open("buch.txt", ios::in);
        while(!fileReadBuch.eof()) {
            fileReadBuch.getline(Text, sizeof(Text));
                //Check übereinstimmung ID
                if(strcmp(Text, ID) == 0) {
                    //lösche Zeile mit ID und die 7 nächsten zeilen
    
                    for(int i = 0; i < 6;i++) {
                        fileReadBuch.getline(Text, sizeof(Text));
                    }
                } else {
                        //schreibe in Buffer Variable
                        strcat(Buffer, Text);
                        strcat(Buffer, "\n");
                    }
    
            }
        fileReadBuch.close();
    
        //schreibe Buffer Variable in Datei
        fstream fileWriteBuch;
        fileWriteBuch.open("buch.txt", ios::trunc|ios::out);
            fileWriteBuch<<Buffer<<endl;
        fileWriteBuch.close();
    }
    


  • Die Zeichen am Anfang dürften schon vorher drin gewesen sein - initialisiere mal Buffer mit "". (oder noch besser, verwende lieber std::string anstelle der char-Arrays)

    Und die Leerzeichen am Ende kommen vermutlich daher, daß das eofbit erst gesetzt wird, wenn eine Leseoperation über's Dateiende hinausgeschossen ist. D.h. im letzten Schleifendurchlauf arbeitest du mit ungültigen Daten.



  • CStoll schrieb:

    Und die Leerzeichen am Ende kommen vermutlich daher, daß das eofbit erst gesetzt wird, wenn eine Leseoperation über's Dateiende hinausgeschossen ist. D.h. im letzten Schleifendurchlauf arbeitest du mit ungültigen Daten.

    Nein, in der Datei steht in der ersten Zeile nur eine 1 und sonst nichts.

    Wie kann ich verhindern das er mit dem letzten Schleifendurchlauf keine ungültige Daten benutzt?



  • dE_MaStEr schrieb:

    CStoll schrieb:

    Und die Leerzeichen am Ende kommen vermutlich daher, daß das eofbit erst gesetzt wird, wenn eine Leseoperation über's Dateiende hinausgeschossen ist. D.h. im letzten Schleifendurchlauf arbeitest du mit ungültigen Daten.

    Nein, in der Datei steht in der ersten Zeile nur eine 1 und sonst nichts.

    OK, dann liest er im ersten Schleifendurchlauf die "1" ein und merkt sie sich. Anschließend kommt die Abfrage auf eof() (ist noch nicht erfüllt - also zweiter Durchlauf). Im zweiten Durchlauf erwischst du das eof und in deinem Puffer bleibt irgendwas stehen.

    Wie kann ich verhindern das er mit dem letzten Schleifendurchlauf keine ungültige Daten benutzt?

    Indem du das eof-Flag direkt nach dem Einlesen abfragst:

    while(file)
    {
      file.getline(...);
      if(!file) break;//Abbruch bei Fehler (schließt EOF ein)
      ...
    }
    

    oder noch kürzer:

    while(file.getline(...))
    {
      ...
    }
    


  • Ich hab das nun ausprobiert, jedoch werden die 2 Leerzeilen am Ende immernoch eingefügt.
    Was mache ich falsch?

    Thx schonmal im vorraus 🙂

    Hier nochmal der Code:

    int leiausBuch(char* ID, char* AusgeliehenVon) {
    fstream fileReadBuch;
    char Text[512] = "";
    char Buffer[512] = "";
    
        fileReadBuch.open("buch.txt", ios::in);
        while(fileReadBuch.getline(Text, sizeof(Text))) {
            //fileReadBuch.getline(Text, sizeof(Text));
                //Check übereinstimmung ID
                if(strcmp(Text, ID) == 0) {
                    //lösche Zeile mit ID und die 7 nächsten zeilen
                    strcat(Buffer, Text);
                    strcat(Buffer, "\n");
    
                    for(int i = 0; i < 6;i++) {
                        if(i <= 4) {
                            fileReadBuch.getline(Text, sizeof(Text));
                            strcat(Buffer, Text);
                            strcat(Buffer, "\n");
                        }
                        if(i == 5){
                            fileReadBuch.getline(Text, sizeof(Text));
                            strcat(Buffer, AusgeliehenVon);
                            strcat(Buffer, "\n");
    
                        }
                    }
                } 
                else {
                        //schreibe in Buffer Variable
                        strcat(Buffer, Text);
                        strcat(Buffer, "\n");
                }
            }
        fileReadBuch.close();
    
        //schreibe Buffer Variable in Datei
        fstream fileWriteBuch;
        fileWriteBuch.open("buch.txt", ios::trunc|ios::out);
            fileWriteBuch<<Buffer<<endl;
        fileWriteBuch.close();
    }
    


  • Erster Tip: Lass die char-Arrays weg und arbeite lieber mit std::string.
    Zweiter Tip: Wenn du die Eingabe nicht weiterverarbeiten willst, kannst du istream::ignore() verwenden.
    Drittens: Ich glaube, ich habe die Leerzeilen gefunden. Die erste hast du mit "strcat(buf,"\n");" ans Ende deines Zwischenspeichers geschrieben (wenn sie dich stört, brauchst du ein "buf[strlen(buf)-1]='\0';" vor der Ausgabe), die zweite per "endl" hinterhergeschossen (das kannst du komplett weglassen - close() kümmert sich auch darum, die Daten physikalisch zu speichern).



  • Super, danke nun klappts.

    Ich würds ja gern mir String Klasse machen, ist aber von der Aufgabenstellung der Schule nicht erlaubt 😞

    Na ja schule eben 🙂



  • Na dann solltest du mal hoffen, daß deine Dateien nicht größer als 512 Byte werden können - C++ kann sehr unfreundlich werden, wenn du jenseits des reservierten Speichers schreiben willst.



  • Jap das habe ich gerade noch geändert.
    Werden jedoch nicht viel Daten reinkommen da es nur eine Schulaufgabe ist.

    Thx, nochmals.

    Gruss Michael


Log in to reply