Letzte Zeile einer .txt löschen



  • Hallo!
    Ich schreibe mit ofstream in eine txt Datei Daten.
    Jetzt läuft danz ganze dann so ab das die letzten Zeile der txt mit

    "\n"
    

    abgeschlossen wird.

    Wie kann ich die letzte Zeile und nur die letzte Zeile, also das

    "\n"
    

    aus der txt mittels einer Funktion entfernen?

    habs schon mit

    ofstream schreiben; 
    schreiben.open("datei.txt",ios::app);
    schreiben << "\b";
    

    probiert. allerdings steht dann in der txt in der letzten zeile ein

    
    

    dankeschön
    mfg


  • Mod

    Gar nicht. Beziehungsweise nur umständlich. Schreib doch das letzte \n einfach nicht rein.



  • ist leider nicht so einfach, da die daten untereinander geschrieben werden und das durch denn benutzer erfolgt.
    also der benutzer gibt was ein - das wird in die datei geschrieben und automatisch wird ein

    "\n"
    

    angehängt.

    hab jetzt mal

    ofstream schreiben; 
    schreiben.open("dvd.txt",ios::app);
    schreiben << '\b \b';
    

    probiert. dann kommt in der letzten zeile

    526368
    

    😃



  • tommy0815 schrieb:

    also der benutzer gibt was ein - das wird in die datei geschrieben und automatisch wird ein

    "\n"
    

    angehängt.

    Was heißt 'automatisch'?
    Schreib halt kein "\n" hinter die Benutzereingabe, sondern immer bevor Du die Benutzereingabe in die Datei schreibst.


  • Mod

    tommy0815 schrieb:

    hab jetzt mal

    ofstream schreiben; 
    schreiben.open("dvd.txt",ios::app);
    schreiben << '\b \b';
    

    probiert. dann kommt in der letzten zeile

    526368
    

    😃

    Du hast eine falsche Vorstellung davon, was \b ist. \b ist ein Zeichen wie jedes andere auch und wird entsprechend einfach nur am Ende deiner Datei angehängt. Es hat bei gewissen Konsolen eine Sonderbedeutung, dass bei Eingabe dieses Zeichens das vorherige Zeichen gelöscht wird, aber dies ist bloß eine Konvention besagter Konsolen. Für alles andere gilt dies nicht.



  • hab ich auch schon drann gedacht.

    nur is dann das problem das am anfang der txt dann eine zeile leer bleibt. was dann beim auslesen der txt noch problematischer wäre.
    die txt datei wird zeilenweise ausgelesen. somit wären dann alle daten um eine zeile nach unten verschoben und würden dann nicht mehr zu meinen variablen passen die ich zeilenweise zuordne.



  • SeppJ schrieb:

    tommy0815 schrieb:

    hab jetzt mal

    ofstream schreiben; 
    schreiben.open("dvd.txt",ios::app);
    schreiben << '\b \b';
    

    probiert. dann kommt in der letzten zeile

    526368
    

    😃

    Du hast eine falsche Vorstellung davon, was \b ist. \b ist ein Zeichen wie jedes andere auch und wird entsprechend einfach nur am Ende deiner Datei angehängt. Es hat bei gewissen Konsolen eine Sonderbedeutung, dass bei Eingabe dieses Zeichens das vorherige Zeichen gelöscht wird, aber dies ist bloß eine Konvention besagter Konsolen. Für alles andere gilt dies nicht.

    verstehe!
    habe im net gelesen das "\b" für backspace stehen soll.
    hab mit das so gedacht das ich BACKSPACE einfach als char oder string einlese und denn dann an die letzte stelle der txt schreiben und somit die letzte zeile gelöscht wird.

    mfg


  • Mod

    tommy0815 schrieb:

    hab ich auch schon drann gedacht.

    nur is dann das problem das am anfang der txt dann eine zeile leer bleibt.

    Dann schreib eben beim ersten Mal kein \n davor.

    was dann beim auslesen der txt noch problematischer wäre.
    die txt datei wird zeilenweise ausgelesen. somit wären dann alle daten um eine zeile nach unten verschoben und würden dann nicht mehr zu meinen variablen passen die ich zeilenweise zuordne.

    Moment mal. Du machst das bloß weil du hinterher Probleme beim Auslesen bekommst? Wie bitte kann es dabei zu Problemen kommen?



  • Dann schreib eben beim ersten Mal kein \n davor.

    würde dann so aussehen:

    1. zeile: daten1
    2. zeile: daten2
    3. zeile: daten3
    4. zeile: daten4 daten1
    5. zeile: daten2
    6. zeile: daten3
    7. zeile: daten4 daten1
    .
    .
    .
    die daten werden so lange eingelesen bis ein abbruch durch denn benutzer erfolgt.

    Moment mal. Du machst das bloß weil du hinterher Probleme beim Auslesen bekommst? Wie bitte kann es dabei zu Problemen kommen?

    die variable die zeile 4 bzw. 7 zugeordnet ist würde dann gleich zwei verschiedene ergebnisse beinhalten.


  • Mod

    tommy0815 schrieb:

    Dann schreib eben beim ersten Mal kein \n davor.

    würde dann so aussehen:

    1. zeile: daten1
    2. zeile: daten2
    3. zeile: daten3
    4. zeile: daten4 daten1
    5. zeile: daten2
    6. zeile: daten3
    7. zeile: daten4 daten1
    .
    .
    .
    die daten werden so lange eingelesen bis ein abbruch durch denn benutzer erfolgt.

    Dann eben nur beim allerersten Mal nicht. Ist das so schwierig zu verstehen? 🙄

    Moment mal. Du machst das bloß weil du hinterher Probleme beim Auslesen bekommst? Wie bitte kann es dabei zu Problemen kommen?

    die variable die zeile 4 bzw. 7 zugeordnet ist würde dann gleich zwei verschiedene ergebnisse beinhalten.

    Versteh ich nicht, wie dir ein \n hinter dem letzten Datensatz die genannten Schwierigkeiten machen soll. Du brauchst doch bloß zeilenweise einlesen.



  • tommy0815 schrieb:

    Dann eben nur beim allerersten Mal nicht. Ist das so schwierig zu verstehen?

    Die abfrage der Daten erfolgt doch in einer schleife:

    while(bis abruch vom benutzer erfolgt)
    {
    nimm daten 1 - schreib in txt "\n"
    nimm daten 2 - schreib in txt "\n"
    nimm daten 3 - schreib in txt "\n"
    nimm daten 4 - schreib in txt "\n"
    -spring dann wieder zum anfang der while()
    }
    

    tommy0815 schrieb:

    Versteh ich nicht, wie dir ein \n hinter dem letzten Datensatz die genannten Schwierigkeiten machen soll. Du brauchst doch bloß zeilenweise einlesen.

    ich lese die daten aus und die werden in einen vector geschrieben. is nun die letzte zeile mit einem "\n" versehen wird diese auch ausgelesen und der vector initialisiert mit dem default konstruktor. heißt - wenn ich alle daten ausgeben steht zum schluß:
    daten 1 = 0
    daten 2 = 0
    daten 3 = 0
    daten 4 = 0

    wobei meine daten parameter einer klasse sind.

    lösche ich allerdings die letzte zeile, z.B per hand nachträglich aus der txt raus, tritt das problem nicht mehr auf.



  • Also schreibst Du doch in der while - Schleife auf jeden Fall vier Mal, oder?

    Dann kannst Du doch auch statt:

    schreibe daten1\n
    schreibe daten2\n
    ...

    erst das \n schreiben:

    schreibe \ndaten1
    schreibe \ndaten2
    ...

    und schon hast Du nach daten4 kein \n mehr.



  • Um die Datei nicht mit \n zu beginnen, machst Du vor der Schleife:

    boolean ErsterSatz = TRUE;
    

    und in der Schleife beginnst Du mit:

    while(...)
    {
       if(!ErsterSatz)
          schreib "\n";
    
       ErsterSatz = FALSE;
    
       schreib daten1;
       schreib "\n";
       schreib daten2;
       schreib "\n";
       schreib daten2;
    }
    

    irgendwie so wirst Du zum Ziel kommen.



  • Versuche das Ganze so weit wie möglich zu abstrahieren und saubere Methoden zu erstellen. Jede Methode macht eine Sache - und die richtig. Du mischt "nimm Daten" (ich vermute das ist die Eingabe durch den Benutzer?) mit dem Schreiben in die Datei. Trenne die Aufgaben!

    In eine Textdatei gehört hinter jede Zeile ein \n. Und genauso liest man sie auch wieder ein. Kein \n gibts nicht.

    Das heißt:

    - Eine Methode liesVierWerteVonBenutzerInVector( )
    - Evtl. testVector( ) // Wertebereich? Plausibilität?
    - schreibeVectorInDatei( ) // 4 Zeilen

    dann wieder:
    - leseVectorAusDatei( ) // 4 Zeilen
    - machWasMitDemVector( )



  • Habs jetzt hinbekommen.
    Ich schreib einfach solange ein

    "\n"
    

    nach meinen daten bis ich ans letzte element im vektor komme. beim letzten element überspringe ich dann diesen schritt.

    ofstream f;
    	int b=vect.size();
    	f.open("daten.txt",ios::trunc);
    	f.close();
    
    	for (int i=0; i<vect.size(); i++)
    	{
    		f.open("daten.txt",ios::app);
    		f<<vect_name[i].daten1()<<"\n";
    		f<<vect_name[i].daten2()<<"\n";
    		f<<vect_name[i].daten3()<<"\n";
    		f<<vect_name[i].daten4()<<"\n";
    		f<<vect_name[i].daten5();
    		if (i+1!=b)
    		{
    			f<<"\n";
    		}
    		f.close();
    	}
    

    Danke @minastaros und @Belli
    die denkanstöße haben weitergeholfen! 🙂


Log in to reply