(xml) datei in c++ bearbeiten (problem:mehrere tags löschen)
-
Hi!
Ich (absoluter C++ Neuling) bastel gerade für die Schule an einem kleinen Programm, dass eine xml-datei öffnen und bearbeiten (tags löschen) soll!
Den Grundaufbau habe ich auch soweit hinbekommen:#include "stdafx.h" #include <iostream> #include <fstream> #include <conio.h> #include <string> using namespace std; int main() { string var; int Anzahl; int i=1; cout<<"Wie viele Tags wollen Sie loeschen? "<<endl; cin >> Anzahl; cout<<endl; do { cout<<"Bitte geben Sie nun den " << i << ". Tagnamen ein! (ohne <,> oder /) "<<endl; cin >>var; i++; ifstream datei; ofstream neuedatei; string zeile; datei.open("test.xml", ios::in); neuedatei.open("temp.xml", ios::out); string start="<" + var + ">",ende="</" + var + ">"; bool ign=false; bool gefunden=false; while(!datei.eof()) { getline(datei,zeile); if(zeile.find(start) !=string::npos) gefunden = true; if(!gefunden) neuedatei << zeile << endl; if(zeile.find(ende) !=string::npos) gefunden = false; } datei.close(); neuedatei.close(); }while (i<=Anzahl); _getch(); return 0; }
Mein Problem ist nun, dass es dem Nutzer ermöglicht sein soll, mehrere Tags zu löschen und nicht nur einen... Daher das ganze als do-schleife...
So kann das aber nicht gehen, da er ja immer noch aus der ersten Datei liest und die neue wieder überschreibt ( so weit - so klar ;)) Ich schaffe es allerdings auch nicht, alles in einer Datei zu machen (also die gleiche datei für ein- und ausgabe)...Wer weiß rat für mich?!
PS: tinyxml u.ä. sind nicht gewünscht (weiß, dass es damit einfacher gehen würde aber ist ja für die Schule...)
-
Wenn die Dateien nicht so groß sind, dann lade sie doch komplett in den Speicher (als std::string) ersetze alles und dann schreib das Resultat am Ende in eine Datei.
-
Dank dir erstmal!
Hast du vllt. ein kurzes Beispiel, wie das geht? (Sorry bin noch n Noob^^)
Was heißt denn "nicht zu groß"? Hätte da ne Datei von ~7mb, klappt das?
-
7mb passt gut in den speicher. Alles in einen string lesen geht zB so:
#include <iterator> #include <fstream> #include <string> ifstream datei("name.xml"); string inhalt(istreambuf_iterator<char>(datei.rdbuf()), istreambuf_iterator<char>()); // jetzt steht alles in inhalt drin
-
Schönen Dank auch an dich!
Soweit versteh ich das auch, nur das hilft mir zunächst einmal noch nicht weiter. Ich muss ja irgendwie den Inhalt dann zwischenspeichern und dannach wieder öffnen, da liegt ja momentan mein Problem...
Wäre es vllt. eine möglichkeit, nach dem ersten löschen, die alte datei zu löschen, die neue umzubennenen und wieder von vorn zu starten oder so? (Oder auch den String wie ist mir relativ egal^^)
-
Du machst alle Änderungen auf dem String "inhalt" und wenn du mit allen Änderungen fertig bist schreibst du den Inhalt von "inhalt" zurück in eine Datei, z.B. die alte Datei (vorher schließen, dann zum schreiben wieder öffnen, allerdings würde ich die alte Datei vorher sichern, aber das geht mit standard-c++ nicht)
-
Du brauchst die alte Datei nur umzubenennen und das geht mit Standard-C++ (std::rename).
-
Braunstein schrieb:
Du brauchst die alte Datei nur umzubenennen und das geht mit Standard-C++ (std::rename).
Auf wen bezieht sich diese Aussage?
Andere Frage:
Wie speicher ich einen String (dessen Wert) in eine Datei? Bekomms irgendwie nicht gebacken
-
std::string inhalt;
std::ofstream out("name.txt");
out << inhalt;
-
momo1 schrieb:
Braunstein schrieb:
Du brauchst die alte Datei nur umzubenennen und das geht mit Standard-C++ (std::rename).
Auf wen bezieht sich diese Aussage?
auf diese Aussage
lolz_ausgeloggt schrieb:
...allerdings würde ich die alte Datei vorher sichern, aber das geht mit standard-c++ nicht