C++ Codefehler// Program bricht ab



  • Also kurz vorneweg,
    ich bin anfänger un habe bisher nur ganz wenig mit c gemacht und jetzt ein
    Tutorial zu C++ durch.

    Jetzt wollte ich ein Programm schreiben das daten in eine datei schreibt bzw. dies wieder ausliest (kann man ja immer mal gebrauchen beim weiteren progen oder?)

    Mein compiler (Dev-C++) meldet auch keinen Fehler aber das Programm schmiert ab,
    und es kommt dieser Windows dialog (Hat fehler festgestellt und musste beendet werden)

    hier mal der Code

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    string dateiname = "Data.exe";
    string text;//ablage für ausgelesenen text
    string funkt = "main"; //letzte laufende funkion
    
    int main();
    int einlesen(int zeile);
    int schreiben(int zeile, string stext);
    
    int main()
    {
        string test = "test";
        schreiben(2, test);
        cout <<"geschrieben \n";
    }
    
    int einlesen(int zeile)
    {
    
        if(zeile < 1)//wenn zeile unter 1 ungültig
        {
                 cout << "interner input-line-error 201\n";
                 return -1;
        }
    
        ifstream input; //inputfilestream objekt
        input.open(dateiname.c_str(), ios_base::in);//öffne dateiname zum einlesen
    
        if(!input)//wenn input fehlschlägt
        {
                  cout << "data-input-error 202\n";
                  return -1;
        }
    
        while(!input.eof()) //solange input nicht beim end of file ist
        {        
            char zeichen;  //zwischenspeicher der einzelnden Zeichen (weil auslesen nur einzelnde Zeichen)
            input.get(zeichen); //einlesen
            if( zeichen == '\n') //wenn ende einer Zeile
            {
                zeile++;//Zeilenanzahl erhöhen
            }
            if(zeile == zeile)//wenn gewünschte Zeilenanzahl erreich
            {
              text+= zeichen; //zeichen in text schreiben
            }
    
        } 
        input.close();//schließt den input
        return 0;// rückgabe des strings an die Aufrufende funktion (hoffentlich)
    }
    
    int schreiben(int zeile, string stext) //achtung die gewünschte Zeile wird komplett überschrieben
    {
        //lesen  
        int geszeilen = 1;//gesamtzahl der Zeilen der datei anfang mit 1
        string gestext;//ablage für den gesamten Dateiinhalt
    
        ifstream input; //inputfilestream objekt
        input.open(dateiname.c_str(), ios_base::in);//öffne dateiname zum einlesen
    
        if(!input)//wenn input fehlschlägt
        {
                  cout << "data-input-error 202\n";
                  return -1;
        }
        while(!input.eof()) //solange input nicht beim end of file ist
        {        
            char zeichen;  //zwischenspeicher der einzelnden Zeichen (weil auslesen nur einzelnde Zeichen)
            input.get(zeichen); //einlesen
            gestext+= zeichen; //zeichen in text schreiben
            if(zeichen == '\n')//wenn Zeichen enspricht neue Zeile
            {
                       geszeilen++;//erhöhen der Zeilenanzahl
            }
        }  
        input.close();//schließt den input
        string zeilentext[geszeilen];//erstellt arry zeilentext so oft wie zeilen
        //ende lesen 1
    
        cout <<"geschrieben \n";
        //lesen 2
        ifstream input2; //inputfilestream objekt
        input2.open(dateiname.c_str(), ios_base::in);//öffne dateiname zum einlesen
    
        if(!input2)//wenn input fehlschlägt
        {
                  cout << "data-input-error 202\n";
                  return -1;
        }
    
        while(!input2.eof()) //solange input nicht beim end of file ist
        {        
            int i = 1; //internes zeilenzählen
            char zeichen;  //zwischenspeicher der einzelnden Zeichen (weil auslesen nur einzelnde Zeichen)
            input2.get(zeichen); //einlesen
            zeilentext[i]+= zeichen; //schreibt die ausgelesenen Zechen in die zugehöhrige zeile
            if( zeichen == '\n') //wenn ende einer Zeile
            {
                i++;//Zeilenanzahl erhöhen
            }
        }
        input2.close();
        //ende lesen 2
    
        //schreiben
        ofstream output; //objekt output aus ofstream
        output.open(dateiname.c_str(), ios_base::out);  //öffnet den output der datei dateiname, und überschreibt
    
        if(!output) // wenn output fehlgeschlagen
        {
            cout << "Output-error 101\n";
            return -1; //raus aus der funkion
        }
    
        string komptext; //sting für den zusammengeführten text
        for(int i = 1; i < geszeilen; i++) //wen internerzähler unter anzahl der zeilen
        {
                if(i == zeile) //wenn interner zähler ist gewünschte Zeile
                {
                     komptext+= stext; //der gesammtext wird um gewünschten text statt vorherigen erweitert
                }
                else
                {
                     komptext+=zeilentext[i]; //ansonsten um vorgänger
                }
        }
        output << komptext; //schreibt text
    
        output.close(); //schließt die output
        return einlesen(1);
    }
    

    ich hoffe die Komentare zeigen die Aufgaben klar genug,

    währe nett wenn ihr mir helfen könntet,

    und am besten währe es wenn ihr mir auch sagt was ihr verändert habt und warum

    danke schon mal



  • Versuche herraus zu fidnen an welcher stelle dein programm abschmirt. Das machst du am bestsen mit dem Debugger oder mit einer MessageBox.

    Beispiel:

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int beepcount = 1;
    void beep()
    {
        char bla[50];
        itoa(beepcount,bla,sizeof(bla));
        MessageBox(0,bla,bla,0);
        beepcount++;
    }
    
    int main(int argc, char *argv[])
    {
        string test;
        beep();
        test.substr(-1,1);
        beep();
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • zusätzlich zu dem hinweis auf den debugger:

    das hier geht nicht

    string zeilentext[geszeilen];
    

    der c++ standard erwartet dort eine konstante. hast du keine, musst du auf dem freispeicher allozieren:

    string *zeilentext= new string[geszeilen];
    

    und entsprechend später wieder freigeben!!

    darüber hinaus fehlt der

    #include <string>
    


  • ich weiß jetzt wo der fehler liegt

    //lesen 2
        ifstream input2; //inputfilestream objekt
        input2.open(dateiname.c_str(), ios_base::in);//öffne dateiname zum einlesen
        cout <<"geschr2ieben \n";
        if(!input2)//wenn input fehlschlägt
        {
                  cout << "data-input-error 202\n";
                  return -1;
        }
        while(!input2.eof()) //solange input nicht beim end of file ist
        {        
            int i = 1; //internes zeilenzählen
            char zeichen;  //zwischenspeicher der einzelnden Zeichen (weil auslesen nur einzelnde Zeichen)
            input2.get(zeichen); //einlesen
            cout <<"geschr3ieben \n";
        :arrow_right:     zeilentext[i]+= zeichen; //schreibt die ausgelesenen Zechen in die zugehöhrige zeile
            cout <<"geschr3ieben \n";
            if( zeichen == '\n') //wenn ende einer Zeile
            {
                cout <<"geschr3ieben \n";
                i++;//Zeilenanzahl erhöhen
            }
        }
        input2.close();
        //ende lesen 2
    

    in der zeile gehts kaput



  • dann siehe oben: leg das array auf den heap!!

    zum zweiten: schau dir deinen code durch, er ist sehr unübersichtlich.
    versuch mal, die globalen variablen zu vernichten.

    so long


Anmelden zum Antworten