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


Anmelden zum Antworten