C++ Parser ifstream ofstream Problem

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

Ich bräuchte etwas Hilfe. Bin gerade dabei einen Parser zu schreiben um eine OpenInventor, also .iv-Datei zu bearbeiten. Wer OI nicht kennt kein Problem. Es geht darum, dass ich in einer Datei (Textdatei) nach von mir bestimmten Schlüsselwörtern suche, welche ich zuvor eingefügt habe.

Beispiel:

Code:
Transform {
          rotation 1 0 0 1.5707
          # l1_s1_t1
          translation 0 0 100
        }

Nun gibt es mehrere dieser Schüsselwörter (# l1_s1_t1, # l1_s1_t2 usw). Ich habe die darum eingefügt, um zu signalisieren, dass die nächste Zeile wichtig ist. Nun möchte ich gerne die 100 bei translation in Zeile 5 in eine andere Zahl, zb. 200 ändern.

Ich gehe so vor, dass ich per ifstream die Datei öffne und Zeile pro Zeile lese. Ist diese wie oben markiert folgt meine Parserfunktion (mit isdigit und die Nullen weg, da ich ja nur die 100 ersetzen möchte). Meine Problem ist dabei, wie ich nun das ganze in der Datei ändere. Ich möchte eigentlich direkt in der Datei die 100 durch eine 200 z.b ändern, bekomme das aber nicht hin. Ich dachte mir dann, dass ich einfach eine andere Datei erzeuge, in die ich alle Zeilen kopiere, welche ich nicht ändern möchte und nur die Zeilen modifiert in die neue Datei speichere, die ich ändern möchte. Dabei hab ich aber das Problem, dass ich nur eine Datei haben möchte. Kann ich eine Datei öffnen und mit getline oder etwas anderen direkt in der Datei modifizieren, d.h nur die Zeile die mir wichtig ist? Falls Fragen sind, einfach stellen
 
Es ist technisch schon möglich einen Wert direkt in einer Datei zu ändern.
In deinem Fall ist aber davon abzuraten. Wenn du mal den Wert 99 in 203 ändern willst, fehlt dir ja der Platz für den neuen Wert.
Deshalb ist es besser eine neue Datei zu schreiben. Am Ende kannst du ja im Programm die alte Datei in .bak umbenennen und der neuen Datei den alten Namen geben. Dann hast du auch ein Backup, falls dein Programm noch fehlerhaft arbeitet.
 
Danke, aber da ich wohl alle paar Minuten/Sekunden dies machen werde wirds wohl zuviele Dateien geben.

Ich gehe dann am besten so vor:

1 Datei X lesen
2 Modifiziert in Datei Y schreiben
3 Datei X löschen
4 Datei Y in X umbenennen


Nur wie kann ich Dateien in c++ umbenennen bzw. löschen?
 
Diese zwei Funktionen sind doch nicht Teil des std Namespace, oder?

<cstdio> ist ja die C++ Version von dem C Header <stdio.h>, aber deshalb stehen die Funktionen doch nicht im std Namespace.

Klär mich mal bitte auf :D

Gruß
BlackMark
 
rename() sollte man nicht verwenden - wenn es die Zieldatei schon gibt, ist das Verhalten implementation-defined. Genauso sieht es mit dem Renamen/Moven über Partitionsgrenzen hinweg aus. Lieber direkt auf das Betriebssystem oder einen Abstraktionslayer zugreifen - letzteres wäre für C++ z.B. boost::filesystem.
 
Zurück
Oben