Problem mit Abbruch der Programmes bei Auslesen eines Strings in eine Datei
-
Wenn ich mir deinen Code ansehe:
* Du prüfst, ob die Eingabedatei geöffnet werden konnte (da oben ist alles OK)
* Du prüfst NICHT, ob die Ausgabedatei (out) geöffnet werden konnte - wenn der Dateiname falsch war, hast du afaik "undefined behaviour"
-
es ist schon mal gegangen komsicherweise. der code ist von einer früheren version abgeleitet.
Wird hier nicht die Datei automatisch angelegt?
Wenn nicht, was muss ich ändern?
Danke.
Johannes
-
Wenn du einen legalen Dateinamen angibst (und entsprechende Rechte besitzt), wird die Datei angelegt. Andernfalls bekommst du einen Fehlerstatus, den du abfangen müßtest:
ofstream out(output.c_str()); if(!out) //Fehlerbehandlung (z.B. neuen Namen abfragen)
-
Vielleicht sollte man noch eine Fehlerbehandlung (try/catch) bei den inserts einfügen. Falls der string im vector nicht lang genug ist käme hier sonst eine Exception.
Das a ist unnötig. vector::size() geht hier auch.
Die Ausgabe könnte auch innnerhalb der for-Schleife erfolgen. So entfällt das aufaddieren des strings.
Die Einrückungen könnten schöner sein.
Das z sollte aus der while-Schleife raus. Einmal zuweisen genügt. Den Typ von z könnte man in bool wandeln.
-
Ich habe jtzt die Fehlerabfrage eingefügt und er schreibt das File nicht. An den Benutzrechten kann es nicht liegen, weil ich auch versucht hab das File auf meinen USB Stick zu schreiben.
Kann mir bitte wer eine Alternative zum Ausgeben des Files schreiben?
Wäre echt nett.
Danke
Johannes
-
Du brauchst hier keine Alternative.
Wie CStoll schon geschrieben hat, wenn der Dateiname legal ist, der evtl. angegebene Pfad existiert und du die entsprechenden Rechte hast, dann wird die Datei auch geschrieben. Was steht denn in output?
-
#include <sstream> #include <fstream> #include <iostream> #include <vector> #include <string> using namespace std; int main(int argc, char **argv) { string str; string dateiname; vector<string> vec; string output; string data; // Auslese String, in welchen die Daten geschrieben werden int a=0; // VARIABLENDEKLARATION a... Zeilenzählvariabel int ii=0; int i=0; int find1; cout << "******************************************************"<<endl; cout << "* TEXTFILTER PROGRAMM *"<<endl; cout << "******************************************************"<<endl; cout << "* Bitte zu oeffnende Datei mit PFAD eingeben *"<<endl; cout << "* PFAD unbeding mit \\ angeben! *"<<endl; cout << "* Bsp.: C:\\dateien\\filename *"<<endl; cout << "******************************************************"<<endl; getline(cin, dateiname); ifstream ifs(dateiname.c_str()); while (!ifs.eof()) { // Einlesen der DATEI getline(ifs, str); // Datei wird Zeile in Vector vec geschrieben vec.push_back(str); // Zeile wird an Vektor a++; } for (ii=0;ii<a;ii++) // FOR SCHLEIFE die geöffnete Datei durchläuft { vec[ii].insert(4,";"); vec[ii].insert(7,";"); vec[ii].insert(9,";"); vec[ii].insert(11,";"); vec[ii].insert(14,";"); vec[ii].insert(126,";"); vec[ii].insert(132,";"); vec[ii].insert(134,";"); vec[ii].insert(136,";"); vec[ii].insert(141,";;\n"); data+=vec[ii]; } cout << data << endl; // Ausgabe am Bildschirm funktioniert ofstream out ("C:\testtest.csv"); // Datei wird nicht geschrieben //verwende Dev-C++ 4.9.9.2 kann es sein, dass es am Compiler liegt? out << data << endl; out.close(); if (!out) { cout << "Die Ausgabe in die Datei hat nicht funktioniert" << endl; } else { cout <<"Datei erzeugt!" <<endl; } cin >> find1; };Wie im Kommentar angefügt, funktioniert die Ausgabe des Strings am Bildschirm, jedoch nicht das Schreiben in den Stream bzw. in die Datei.
Irgendwas ist das verhext...

Bitte um Hilfe.
Danke
Johannes
-
keboo schrieb:
ofstream out ("C:\testtest.csv"); // Datei wird nicht geschriebenAlso das ist bestimmt kein legaler Dateiname - \t wird vom Compiler durch ein Tabulator-Zeichen ersetzt.
(@USB-Stick: schau dir den Stick mal an, ob eventuell der Schreibschutz eingeschaltet ist)
-
Du solltest den Test if( !out) direkt nach dem Instanziieren von out machen. In deinem Quelltext ist out ja schon zu.
-
Also so
ofstream out ("C:\\testtest.csv"); if (!out) { cout << "Die Ausgabe in die Datei hat nicht funktioniert" << endl; } else { out << data << endl; out.close(); cout <<"Datei erzeugt!" <<endl; }
-
Das war leider auch nicht die Lösung. Es geht auch mit c:\\testtest.csv nicht.
Das kommt mir ein wenig spanisch vor das ganze.
Wär mir echt sehr geholfen, wenn mir da wer weiterhelfen kann.
Danke,
johannes
-
Kann es sein, dass beim ofstream Befehl irgendetwas nicht passt?
Bin schon leicht verzweifelt, da ich keine Ahnung habe, was da nicht passt.
johannes
-
So wie es da steht sollte es funktionieren. Bist du mal mit einem Debugger durchgegangen? Wechsle mal das Verzeichnis bzw. den Dateinamen.