fstream will nicht speichern..
-
soo,
also ich habe meine Klasse, die einen Datenarray data beinhaltet.
Dieser ist ein vektor aus vektoren, welche strings beinhalten
Quasi so:typedef vector<std::string> vec_str; typedef vector<vec_str> vec_array; in der Klasse : private: vec_array data;Ich kann dort Daten ablegen und wieder rausholen.. nun möchte ich sie auch noch unverschämterweise in eine Datei schreiben.
Die Datei ist am Ende leer.int cFile::commit (void) { string row = ""; int i, a; file.open(Filename.c_str(), ios::out); for (i = 0; i < data.size(); i++) { for (a = 0; a < head.size(); a++) { row += data[i][a] + "::" ; } row += "\n"; file.write (row.c_str(), row.size() ); file.flush(); row.clear(); } file.close(); }Beim Durchtracen gabs keinerlei Fehler. row war ein String der meine Daten korrekt mit dem gegebenen Trennzeichen trennte. Ergo sowas wie
"hans::wurst::berlin::keine nummer::\n"Trotzdem landete nichts in der Datei...
Kann mir irgendwer nen Hinweis geben, was das Problem ist?
-
warum minimierst du dein problem nicht so das nur noch code zu sehen ist wo du versuchst einen string in eine datei zu schreiben?
-
Hallo,
wo sind deine Fehlerchecks? Dateioperationen (wie öffnen, schreiben, lesen) sollte man immer auf ihren Erfolg überprüfen. Das wäre ein Anfang.Btw. Warum gehst du den Umweg über row? Warum schreibst du nicht direkt in die Datei? Und warum flushst du nach jedem Schreiben? Und warum löschst du alle Fehlerbits, wo du doch gar nicht auf Fehler prüfst?
-
der flush() ist nen Relikt..
Ich portiere diese Klasse aus PHP, wo ich für eine Datenbank keine Datenbank hatte..
Da musste der flush genutzt werden. Der flush selber ist allerdings auch nicht das Problem...Ookay, aber da hast du recht, ich bin auch grade dabei, diese Tests einzubauen..
Aber wo leere ich die Fehlerflags?
-
DocJunioR schrieb:
Aber wo leere ich die Fehlerflags?
Mein Fehler. Habe row.clear() als file.clear() gelesen.
-
HumeSikkins schrieb:
Und warum löschst du alle Fehlerbits, wo du doch gar nicht auf Fehler prüfst?
Irrtum, ich habe einen string::clear() durchgeführt, keinen file::clear().
Witzigerweise war dieses trotzdem des Pudels End..
Ich hab den Filestatus gelöscht bevor ich die Datei geöffnet hab und es ging.
Was Du nicht wissen kannst ist, dass ich den gleichen fstream auch schon zum Laden benutzt hab und da wird spätestens bei einer nicht existierenden Datei nen Fehler auftauchen, oder bei einer leeren..Auf jeden Fall werd ich mir angewöhnen, nicht blind Dateien oder besser streams zu nutzen..
-
Was Du nicht wissen kannst ist, dass ich den gleichen fstream auch schon zum Laden benutzt hab und da wird spätestens bei einer nicht existierenden Datei nen Fehler auftauchen, oder bei einer leeren..
...oder nachdem du die komplette Datei gelesen hast.
-
Auf jeden Fall werd ich mir angewöhnen, nicht blind Dateien oder besser streams zu nutzen..
Ich hoffe du willst uns damit nicht sagen, dass in deinem professionellen Umfeld Return- bzw. Fehler-Codes ignoriert werden

-
Naaja, ich glaub mal, dass sie vorgeschrieben sind.. bin noch nicht soo hundertprozentig durchgeklettert, zumal ich eh mit meinen Programmen nen Grenzgänger bin. C++, PHP und ähnliches sind hier zwar erlaubt, werden aber im Allgemeinen nicht genutzt. Oder einfacher : COBOL rulez.

-
Zum Schreiben / Anfügen benutze ich ofstream, ist einfach angenehm, für mich zumindest =))
Versuchs damit:std::string name = "/path/to/the/file"; ofstream file(name, ios::app); if(!file) { cerr << "Cant open the file " + name + ". Aborting.." << endl; exit(1); } file << "text wird angefügt.. und new line hinterher..." << endl; file.close();
-
ursprünglich dachte ich, aus performancegründen ein File-Objekt zu benutzen, welches einfach offen bleibt.
Ist aber auch blödsinn.
Auf jeden Fall hab ichs als fstream in der Klasse gelassen..Aaber es geht ja jetzt, nachdem ich einfach mal die Flags vor dem nächsten Öffnen gecleart hab