laubi Geschrieben 2. Januar 2011 Geschrieben 2. Januar 2011 hallo erstmal. also ich habe ein kleines Programm geschrieben, allerdings hab ich einen fehler, ich weiß wo er ist, allerdings nicht wie ich ihn wegbekomme. und dann noch eine kleine frage. erstmals der quellcode: #include <string> #include <iostream> #include <fstream> #include <sstream> #include <utility> using namespace std; int main(int argc, char **c_argv) { [INDENT]//-----1-----\\ string *argv; argv=new string [argc]; for(int i=0; i<argc; i++) [INDENT]argv[i]=c_argv[i];[/INDENT] //-----2-----\\ char t[2][200]; const string pfad("C:\\myproggs\\mykeys\\keys.mykeys"); pair <char *,char *> element[1000]; //pair deswegen weil es immer 2 elemente sind die fix zusammengehören fstream file; int x; ostringstream command; short aus; //-----3-----\\ file.open(pfad,ios::in); if(file.fail()) { [INDENT]cout <<"error"; return 0;[/INDENT] } for(x=0;!file.eof();x++) { [INDENT]for(int i=0; i<2; i++) [INDENT]file.getline(t[i],200); [/INDENT] element[x]=pair<char *,char *>(t[0],t[1]);[/INDENT] } file.close(); //-----4-----\\ for(int i=0; i<x; i++) [INDENT]cout <<i+1<<": "<<element[i].first<<endl;[/INDENT] cout<<endl<<"Bitte auswahl eingeben: "; cin>>aus; command<<"start firefox "<<element[aus-1].second; system(command.str().c_str()); delete [] argv; return 0; /* die elemente sind so angeordnet in der datei: name webseite name webseite name webseite*/[/INDENT] } also die kleine frage: bei //1\\wandle ich die c-string argumente in strings um, muss ich das so machen wie oben geschrieben oder geht das auch "schöner"? ich habs versucht mit int main(int argc,string argv[]) aber beim aufruf der argumente, ( z.B: cout <<argv[0]; tritt ein fehler in der "iosfwd" auf. nun das größere problem: wenn ich das programm jetzt ausführe. (nehmen wir an in der datei steht das drin: name1 webseite1 name2 webseite2 name3 webseite3 ) kommt folgene ausgabe des programms: 1: name3 2: name3 3: name3 und egal welchen link ich aufrufe, es kommt immer webseite 3 nach testen der zählervariablen weiß ich das das problem in der zeile 37 ( element[x]=pair<char *,char *>(t[0],t[1]); ) liegt, allerdings nicht wo. wenn ihr mir helfen könntet wäre ich euch sehr dankbar, ich finde das ist ein sehr gutes forum, weswegen ich meine fragen immer hier stelle. großes kompliment lg Laubi Zitieren
Klotzkopp Geschrieben 2. Januar 2011 Geschrieben 2. Januar 2011 Das sieht nach einem wilden Mischmasch von C und C++ aus. Du machst dir mit den vielen Zeigern unnötig das Leben schwer. Benutz std::vector statt Arrays. Benutz std::string statt char*. eof eignet sich nicht als Schleifenbedingung, weil es erst dann true ergibt, wenn bereits ein Lesevorgang fehlgeschlagen ist. Das Stringarray für die Kommandozeilenparameter wird am Anfang angelegt und gefüllt, und am Ende gelöscht, aber dazwischen nicht benutzt. Dein Problem rührt übrigens daher, dass du immer wieder dieselben char-Zeiger t[0] und t[1] in deinem element-Array speicherst. Zitieren
laubi Geschrieben 2. Januar 2011 Autor Geschrieben 2. Januar 2011 ah, danke, aber ein paar fragen ja doch noch int main(int argc, char **c_argv) { [INDENT]//-----1-----\\ string *argv; argv=new string [argc]; for(int i=0; i<argc; i++) argv[i]=c_argv[i];[/INDENT] das ist in dem beispiel noch sinnlos, stimmt, aber es ist ja noch nicht feritig und die argumente werden auch noch zum sinn kommen, allerdings ist meine frage eher, wie ichs besser machen kann anstatt den code oben. warum ich die vectoren vergessen habe ist peinlich, danke für die erinnerung und das mit den zeigern hätte mir auch auffallen müssen, peinlich peinlich peinlich auf alle fälle danke Zitieren
Klotzkopp Geschrieben 2. Januar 2011 Geschrieben 2. Januar 2011 das ist in dem beispiel noch sinnlos, stimmt, aber es ist ja noch nicht feritig und die argumente werden auch noch zum sinn kommen, allerdings ist meine frage eher, wie ichs besser machen kann anstatt den code oben.Ich sehe keinen Grund dafür, die Kommandozeilenparameter überhaupt zu kopieren. Aber dieser Code (einschließlich des delete[] am Ende) ließe sich auch durch einen schicken Einzeiler ersetzen: vector<string> argv(c_argv, c_argv + argc); Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.