Schleife stürtzt ab.
-
Hallo!
Hab ein ür mich nicht lösbares Problem.
Das Programm soll ein Textfile einlesen (funktioniert), ein wenig umgestalten und dann ein csv File auslesen.Hier der Code: Sorry, dass er so lange und vielleicht etwas unüberischtlich ist. Bitte um mögliche Hinweise, was sein könnte, dass die lange For-Schleife mit den inserts der Semikolons instabil ist.
#include <fstream> #include <iostream> #include <vector> #include <string> using namespace std; int main(int argc, char **argv) { string str; fstream f; string dateiname; vector<string> vec; string output; string C=" "; string S=" "; string L=" "; string data; // Auslese String, in welchen die Daten geschrieben werden int a=0; // VARIABLENDEKLARATION a... Zeilenzählvariabel int ii=0; int i=0; int add=0; // Variablen für Berechnung char* StopPosition = 0; cout << "******************************************************"<<endl; cout << "* TEXTFILTER PROGRAMM - Johannes JAN 2006 *"<<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 //STÜRTZT AB - Wo kann Fehler liegen? { if (vec[ii].substr(111,1)=="C") { C=vec[ii].substr(24,52); C+=";"; } if (vec[ii].substr(111,1)=="S") { S=vec[ii].substr(24,52); S+=";"; } if (vec[ii].substr(111,1)=="L") { L=vec[ii].substr(24,52); L+=";"; } if (vec[ii].substr(10,2)!= " ") { if (vec[ii].substr(0,2)=="00" || vec[ii].substr(0,2)=="01" || vec[ii].substr(0,2)=="02"|| vec[ii].substr(0,2)=="03" || vec[ii].substr(0,2)=="04" || vec[ii].substr(0,2)=="05" || vec[ii].substr(0,2)=="06") { vec[ii].insert(0,"20"); add=2; } if (vec[ii].substr(0,2)=="87" || vec[ii].substr(0,2)=="95" || vec[ii].substr(0,2)=="96" || vec[ii].substr(0,2)=="97" || vec[ii].substr(0,2)=="98" || vec[ii].substr(0,2)=="99") { vec[ii].insert(0,"19"); add=2; } vec[ii].insert(0," "); // Semikolons werden anfgefügt vec[ii].insert(5+add,";"); vec[ii].insert(8+add,";"); vec[ii].insert(10+add,";"); vec[ii].insert(12+add,";"); vec[ii].insert(15+add,";"); vec[ii].insert(19+add,";"); vec[ii].insert(22+add,";"); vec[ii].insert(27+add,";"); vec[ii].insert(32+add,";"); vec[ii].insert(34+add,";"); vec[ii].insert(43+add,";"); vec[ii].insert(48+add,";"); vec[ii].insert(50+add,";"); vec[ii].insert(57+add,";"); vec[ii].insert(91+add,";"); vec[ii].insert(97+add,";"); vec[ii].insert(103+add,";"); vec[ii].insert(105+add,";"); vec[ii].insert(114+add,";"); vec[ii].insert(115+add,";"); vec[ii].insert(127+add,";"); vec[ii].insert(133+add,";"); vec[ii].insert(135+add,";"); vec[ii].insert(137+add,";"); vec[ii].insert(142+add,";"); vec[ii].insert(143+add,C); vec[ii].insert(196+add,S); vec[ii].insert(249+add,L); data+="\n"; data+=vec[ii]; // neuer Vektor wird dem Data String zugeführt } } f.open("C:\\test\\test_57.csv",ios::out); // Ausgabe in .csv Datei f << data << endl; if (!f) { cout << "Die Ausgabe in die Datei hat nicht funktioniert" << endl; } else { f.close(); cout <<"Datei erzeugt!" <<endl; } cin >> find1; };Kann es sein, dass meine Einlesezeilen zu lange sind?
Bitte euch um Hinweise, wie ich das Problem eleganter und vor allem stabiler lösen kann.Recht herzlichen Dank,
Johannes

-
Es kann sein, daß du über das Vektorende hinausliest - nimm lieber "for(ii=0;ii<vec.size();++ii)" für deine Schleifenbedingung.
Ansonsten ist es vielleicht günstiger, die Daten direkt auszugeben als sie in einen (fast) endlosen String zu verpacken

-
Hi!
Wie kann ich die Daten direkt ausgeben?
Die Schleife stürtzt trotzdem ab.
Danke für weitere Hinweise.
Johannes
-
f.open("out.csv",ios::out); for(ii=0;ii<vec.size();++ii) { //Element vec[ii] verarbeiten //... f<<vec[ii]<<endl; } f.close();Ansonsten rate ich dir mal, eine Debug-Ausgabe in die Schleife einzubauen (nach cout oder cerr).
PS: Da du sowieso zeilenweise arbeitest, brauchst du den Vector überhaupt nicht:
ifstream fin("in.txt"); ofstream fout("out.csv"); string line; while(getline(fin,line) { //bearbeite aktuelle Zeile fout<<line<<endl; }
-
werd mal versuchen dass programm dahingehend umzustellen.
hoffe es funktioniert dann.
danke für den hinweis.
melde mich wieder, wenns nicht klappen sollte.
johannes