Dateiinhalt kopieren
-
Hi,
ich weiss einfach nicht was ich falsch mache... Ich habe eine students.txt und eine temp.txt. Ich moechte jetzt Eintraege aus students.txt loeschen. Dazu lese ich jede Zeile ein und gebe dann alle Zeilen vor der Uebereinstimmung in temp.txt aus und springe nach der Uebereinstimmung noch mal 8 Zeilen weiter, da ich diese auch loeschen will und geben den rest des Dateiinhaltes ebenfalls in temp.txt aus.Das funktioniert noch wunderbar, jetzt moechte ich aber den ganzen inhalt, so wie er in der temp.txt vorliegt in die students.txt wieder zurueck kopieren. Dabei kommt es jedes mal vor, dass er nicht die students.txt ueberschreibt sondern jedes mal den Inhalt von temp.txt ans Ende von students.txt dran haengt.
Ich habe schon alles moegliche probiert.... von ios::trunc, bis seekp(0, ios::beg), damit er den Inhalt von students.txt mit dem aus temp.txt ueberschreiben wird.
#include "dels.h" dels::dels() { // Nach Nachname suchen string name; cout << endl; cout << " Bitte geben Sie zu aller Erst nur den Nachnamen des Schuelers an,\n"; cout << " den Sie loeschen moechten, im 2. Durchlauf koennen Sie dann die\n"; cout << " ID des Schuelers angeben, um eine nur seine Daten zu loeschen.\n\n"; cout << " Nachname des Schuelers: "; cin >> name; students.open("db/students.txt"); vector<string> zeilen; while(! students.eof()) { string z; students >> z; zeilen.push_back(z); } // Ausgabe wenn eine Uebereinstimmung existiert for(size_t i=0; i<zeilen.size(); ++i) { if(zeilen[i] == name) { cout << " Schuelerdaten:\n\n"; cout << " ID: \t\t\t" << zeilen[i-2] << endl; cout << " Vorname: \t\t" << zeilen[i-1] << endl; cout << " Nachname: \t\t" << zeilen[i] << endl; cout << " PLZ: \t\t\t" << zeilen[i+1] << endl; cout << " Ort: \t\t\t" << zeilen[i+2] << endl; cout << " =====================================\n"; } } temp.open("db/temp.txt"); // ID eingeben um Schueler zu loeschen und speichern in temp string id; cout << endl; cout << " ID des students: "; cin >> id; while(! students.eof()) { string z; students >> z; zeilen.push_back(z); } for(size_t i=0; i<zeilen.size(); ++i) { if(zeilen[i] != id) { temp << zeilen[i] << endl; } else if(zeilen[i] == id) { i += 8; } } temp.close(); students.close(); students.open("db/students.txt", ios::trunc); temp.open("db/temp.txt", ios::in); // Inhalt von temp nach students kopieren (students soll dabei ueberschreiben werden) while(! temp.eof()) { string z; temp >> z; zeilen.push_back(z); } for(size_t i=0; i<zeilen.size(); ++i) { students << zeilen[i] << endl; } temp.close(); students.close(); }
-
Wozu brauchst du überhaupt eine zweite Datei? Du liest doch sowieso den kompletten Dateiinhalt in einen vector<> ein, da kannst du auch gleich vor Ort die unerwünschten Zeilen entfernen und die Daten anschließend zurückschreiben.
PS: Eigentlich tritt dein "Fehler" nur auf, wenn die Zieldatei als ios::append geöffnet wurde.
-
Liegt es vielleicht daran das du die temp-Daten nicht mit ios::trunc öffnest?
-
CStoll schrieb:
PS: Eigentlich tritt dein "Fehler" nur auf, wenn die Zieldatei als ios::append geöffnet wurde.
genau das dachte ich auch, deshalb ist mein Fehler ja so absurd....
wieso? trunc sagt ja, dass die Dateilaenge auf 0 gesetzt wird, das prog liest den Dateiinhalt aus temp.txt perfekt aus, nur ueberschreibt er die students.txt nicht, sondern haengt es hinten dran.
-
Coda@linux.PrayLoad schrieb:
wieso? trunc sagt ja, dass die Dateilaenge auf 0 gesetzt wird, das prog liest den Dateiinhalt aus temp.txt perfekt aus, nur ueberschreibt er die students.txt nicht, sondern haengt es hinten dran.
Und bist du sicher, daß in der Temp-Datei nur die Daten drinstehen, die du beim aktuellen Programmdurchlauf dort reingeschrieben hast? Du verwendest immer die selbe Datei, also könnte sich dort im Lauf der Zeit alles ansammeln, was du bisher eingelesen hast.
(PS: Und meine Frage steht immer noch - wozu brauchst du die zweite Datei, wenn du schon einen vector<> als Zwischenspeicher zur Verfügung hast?)
-
Ohhhhhhhhh
Es lag an dem ****** vektor, ich habe ihn ja 2 mal den selben Vektor verwendet (zum ausgeben in temp und zum ausgeben in students). Dadurch war ja auch noch der Inhalt vom originalen students im Vektor und hat die Datei zwar jedes mal ueberschrieben, es sah nur so aus als ob er den Inhalt aus temp in students ans Ende gehaengt hat.
Rgds
Coda