zeilen in Text datei ändern

Welcher Lese und Schreib Zeiger, du meinst den IOS-Base in und out
Und wie kann ich den identisch machen dass es funktioniert,ich habe nämlich überhaupt keine Ahnung was ich an dem code ändern könnte.
Denn Code denn du mir gegeben hast, verstehe ich nicht mal richtig, also wüsste ich nicht was daran ändern. Ich sehe nur dass es mir die Zeile nicht ändert.
 
Ändern kannst du es eh nur wenn du alles einließt, die Zeile änderst und wieder alles rausschreibst.

ignore schmeißt nur alles was im stream ist bis zum nächsten '\n' raus. Brauchst du ja eh nicht.
 
Eben mit dem code wo du mir gegeben hast, lese ich ja die datei ein, wo z.b. 5 zeilen text sind und dann im 'cin' gebe ich ja den text ein, dür die 3.te zeile, und danach speichert es doch den neuen text mit der eingebenen 3ten zeile über den alten text, verstehe ich doch richtig?
Und zum auslesen habe ich schon eine Funktion, aber die datei hat es ja mir nicht geändert. Und das verstehe ich nicht warum, den zum kontrollieren kann ich ja auch das wordpad beutzen.
 
Hi.

Lemieux66 hat gesagt.:
Eben mit dem code wo du mir gegeben hast, lese ich ja die datei ein, wo z.b. 5 zeilen text sind und dann im 'cin' gebe ich ja den text ein, dür die 3.te zeile, und danach speichert es doch den neuen text mit der eingebenen 3ten zeile über den alten text, verstehe ich doch richtig?
Nein. Eine Datei wird nicht zeilenweise gespeichert. Du kannst eine Zeile nur ändern, wenn die neue Zeile exakt die gleiche Anzahl von Zeichen enthält wie die alte Zeile.

Wenn du auf eine beliebige Zeile zugreifen willst, dann lies die Datei am besten erstmal in eine geeignete Datenstruktur ein, die dir wahlfreien Zugriff bietet - z.B. ein std::vector.

Wenn du Zeilen ändern willst, dann ändere die Zeilen in der Datenstruktur - also im Speicher. Wenn du dann fertig bist, dann speichere die Datenstruktur komplett in der Datei ab, indem du die Datei komplett überschreibst.

Gruß

PS: Und halte dich bitte an die Netiquette. Deine Beiträge sind ja unlesbar...
 
Ich habe mich da noch im Internet erkundigt, nun habe ich gelesen, dass man Zeile um Zeile ändern kann, indem ich zuerst bis zu der zu ändernde Zeile einlese, dann die neue Zeile eingebe und schliesslich den Rest nach der geänderten Zeile wieder einlese.

Somit muss ich nicht darauf achten, ob die neue Zeile gleich lang ist wie die alte Zeile.
Hast du damit Erfahrung, ich habe keinen blassen Schimmer wie ich das anstellen soll.
 
Ich habe mich da noch im Internet erkundigt, nun habe ich gelesen, dass man Zeile um Zeile ändern kann, indem ich zuerst bis zu der zu ändernde Zeile einlese, dann die neue Zeile eingebe und schliesslich den Rest nach der geänderten Zeile wieder einlese.

Somit muss ich nicht darauf achten, ob die neue Zeile gleich lang ist wie die alte Zeile.
Hast du damit Erfahrung, ich habe keinen blassen Schimmer wie ich das anstellen soll.
Das funktioniert nur falls der geänderte Teil nicht zu lang ist und den noch nicht eingelesenen Teil der Datei überschreibt.

Wieso liest du die Datei denn nicht in einen std::vector ein? Ständig irgendwelche Zeilen in einem Stream zu suchen ist doch Unfug.

Gruß
 
Würde ich gerne mit deiner Methode machen, aber leider bin ich Anfänger und habe überhaupt keine Ahnung was std::vector ist, dann müsstest du mir alles "vorkauen" und ich denke die Zeit hast du nicht?!
Oder hast du die Zeit mir es zu erklären oder in den vorigen Code einzubauen?

Gruss
 
Würde ich gerne mit deiner Methode machen, aber leider bin ich Anfänger und habe überhaupt keine Ahnung was std::vector ist, dann müsstest du mir alles "vorkauen" und ich denke die Zeit hast du nicht?!
Oder hast du die Zeit mir es zu erklären oder in den vorigen Code einzubauen
Naja, du nimmst einfach den Code aus diesem Thema http://www.tutorials.de/forum/c-c/331226-aus-txt-nach-abc-ordnen.html und ersetzt jedes Vorkommen von "list" durch das Wort "vector" und schon sind die Zeilen im std::vector gespeichert.

Dann kannst du auf die Zeilen wie auf ein Array zugreifen:
C++:
cout << "Zeile 4: " << content[3] << endl;

content[3] = "neuer Inhalt";
Um den Inhalt der Datei mit völlig beliebigem anderen Inhalt zu überschreiben, solltest du die Datei am besten erstmal schließen und dann wieder mit der Option "trunc" öffnen:
C++:
in.close();
in.clear();

in.open("abc.txt", ios::out | ios::trunc);
Danach kopierst du wie gehabt alle Zeilen aus dem vector in die Datei.

\edit: Falls du das Sortieren beibehalten willst, dann mußt du für den vector die Anweisung zum Sortieren so ändern:
C++:
sort(content.begin(), content.end());
Gruß
 
Zuletzt bearbeitet:
Hi
Ich habe nun das probiert was du mir gesagt hast.....

Code:
int aendern()
{

 ifstream in("Ablage.txt");
 
  if (!in.is_open()) {
    cerr << "cannot open file.";
    return 1;
  }
 
  string line;
  vector<string> content;
 
  while (getline(in, line)) {
      content.push_back(line);
  }
  cout << "Zeile 4: " << content[3] << endl;
 
  content[3] = "neuer Inhalt";
  
  in.close();
  in.clear();
 
  in.open("Ablage.txt", ios::out | ios::trunc);
    

    
}

Jetzt zeigt es mir den Text aus Zeile 4 an und löscht danach alles.
Was ich jetzt nicht verstehe, bei
Code:
content[3] = "neuer Inhalt";
sollte es doch mir die neue Zeile hineinschreiben,aber das tut es mir ja nicht.

Und warum muss ich alles mit
Code:
 in.clear();
löschen, kann ich mit verctor nicht die einzelne Zeile ersetzen?

Und wie kopiere ich denn jetzt wieder die Zeilen hinein wenn sie gelöscht sind?

Nein, das mit sortieren will ich so lasse, das habe ich als eigene Funktion die mir zum Glück gut funktioniert.

Gruss und Danke...
 
Hi.

Du hast vergessen meinen Hinweis bezgl. des Speicherns zu beachten:
Danach kopierst du wie gehabt alle Zeilen aus dem vector in die Datei.
Du solltest dir ruhig mal die Dokumentation zu den Funktionen durchlesen. Die Methode .clear() löscht nichts, sie ist dazu da den Fehlerzustand des Streams zurückzusetzen. Gelöscht wird der Inhalt der Datei durch die Angabe der Option ios::trunc beim Öffnen.

Gruß
 
Zuletzt bearbeitet:
Zurück