Zum Inhalt springen

wertzuweisung mit pair <>


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben
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);

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...