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 2in 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