ofstream Speicherziel
-
bei ofstream gibt man ja das Speicherziel mit dem Dateinamen an zB:
ofstream saveFile(C:\\MeinTest.txt, ios::out);
Ich habe dies sowie den Inhalt, was in die Datei geschrieben wird, in eine Funktion geschrieben
(void DatenSpeichern(AnsiString& filename, AnsiString& target, /*....*/){ }
Ich benutze einen SaveDialog mit dem ich die Daten speichere und wo ich die Funktion aufrufe. Das funktioniert auch.
Nun habe ich ein zweites Formular wo es einen "autosave-Button" gibt. Zusätzlich kann man über ein "LMDBrowseEdit" und ein Edit das Speicherziel und den Dateiname festlegen. Die Zeit wann gespeichert wird ist einstellbar. Die in den beiden Editfeldern stehenden AnsiStrings nehme ich gleich als Standard-Werte für den SaveDialog. Da der ofstream Konstruktor nur einen String entgegennimmt wollte ich das Speicherziel und den Dateinamen zusammensetzen:
ofstream saveFile(strncat(filename.c_str(), target.c_str(), strlen(target.c_str())), ios::out);
Das manuelle Speichern über den SaveDialog funktioniert, aktiviere ich das autosave, bekomme ich einen Speicherfehler nach der eingestellten autosave-Zeit.
-
strncat(filename.c_str(), target.c_str(), strlen(target.c_str()))
Ganz böse!!! Du schreibst in Speicher, der nicht von dir allokiert wurde!!!
Was du wirklich willst:
AnsiString sFile = target + filename; // evtl. noch Pfadtrennzeichen '\\' einfügen ofstream saveFile(sFile.c_str());
-
oh ja, das hatt ich auch grad probiert. Leider speichert er bei mir nicht. irgendwo ist da noch was faul.
-
dann schau dir mal an was du als Pfad zusammengebaut hast. Da stimmt sicher was nicht
greetz KN4CK3R
-
falls das Verzeichnis nicht stimmt bzw. nicht existiert wird auch nicht gespeichert, dann mußt du erst kontrollieren ob schon da ist (DirectoryExists) und dann eventuell anlegen (CreateDir)
und wenn wir schon dabei sind: die Kontrolle ob die Datei schon existiert geht mit FileExists, vielleicht willst du sie ja nicht überschreiben...
-
Fehler gefunden, die Variablennamen beim Anlegen des Strings waren vertauscht wie mir der Debugger zeigte. Das mit dem FileExists baue ich vll noch ein. Vielen Dank für den Tipp.