Erstes MFC-Programm: String-Probleme...



  • Ja hallo ertmal!
    Ich bin noch ein C++ Einsteiger und hab in der Schule mit dem Programmieren angefangen, allerdings bis jetzt nur Konsolenanwendungen. Diese Woche hatten wir das Thema Dateizugriff und da hat's mich gereizt mal ein Programm zu schreiben, dass ich mir schon länger wünsche:
    Es geht um GTA San Andreas und zwar muss man, wenn man neue Autos in das Spiel einfügt, die Konfigurationsdateien angleichen, die reine Textdateien sind. Also muss man die Konfigurationszeile aus der Readme des Authors rauskopieren und dann die jeweilige GTA Konfigurationsdateien öffnen, die entsprechende Zeile suchen und ersetzen.

    Dies Config-Files sehen ungefähr so aus (nur ein kleiner Auszug):

    411, 	infernus, 	infernus, 	car, 		INFERNUS, 	INFERNU, 	null,	executive, 	5, 	0,	0,		-1, 0.7, 0.7,		0
    412, 	voodoo, 	voodoo, 	car, 		VOODOO, 	VOODOO, 	null,	poorfamily,	10, 	0,	0,		-1, 0.7, 0.7,		0
    413, 	pony,		pony,		car, 		PONY, 		PONY, 		van,	worker,		10, 	0,	0,		-1, 0.72, 0.72,		-1
    414, 	mule, 		mule, 		car, 		MULE, 		MULE, 		null,	worker, 	10, 	0,	0,		-1, 0.76, 0.76,		-1
    415, 	cheetah, 	cheetah, 	car, 		CHEETAH, 	CHEETAH, 	null,	executive, 	5, 	0,	0,		-1, 0.68, 0.68,		0
    416, 	ambulan, 	ambulan, 	car, 		AMBULAN, 	AMBULAN, 	van,	ignore,		10,	0,	0,		-1, 0.864, 0.864,	-1
    417, 	leviathn, 	leviathn, 	heli, 		LEVIATHN, 	LEVIATH, 	null,	ignore,		5,	0,	0,		-1, 0.54, 0.4,		-1
    418, 	moonbeam, 	moonbeam, 	car, 		MOONBEAM, 	MOONBM, 	null,	normal,		10, 	0,	0,		-1, 0.7, 0.7,		0
    419, 	esperant, 	esperant, 	car, 		ESPERANT, 	ESPERAN, 	null,	normal,		10, 	0,	0,		-1, 0.64, 0.64,		0
    

    Ich möchte das ganze automatisieren und hab angefangen, ein MFC-Progrämmchen zu schreiben, das die Textdatei einlesen soll, der Benutzer kopiert dann die Konfigurationszeile in ein Textfeld und das Programm soll dann am besten die ersten 8 stellen in einen anderen String kopieren und diesen dazu benutzen, nach genau dieser Zeichenfolge in der Textdatei zu suchen und die entsprechende Zeile mit der neuen zu ersetzen.

    Die Funktion für den Button sieht folgendermaßen aus:
    http://img68.imageshack.us/img68/893/cplus3xh.jpg

    void CGTAConfixxDlg::OnOk2() 
    {
    
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	UpdateData(TRUE);
    
    	FILE *FDatei;
    	int i=0;
    	char cFile[1000][255]={" "};
    
    	FDatei=fopen(m_folder, "r+");	// Datei öffnen, r+ = lesen & schreiben
    
    	do
    	{
    	fgets(cFile[i], 253, FDatei);	// jede Zeile wird in einem Feld gespeichert
    	i++;							// zählt die Zeilen hoch
    	}while(!feof(FDatei));			// lese bis Dateiende
    	m_debug=i;						// Debug-Zeile, um verschiedene Dinge zu testen
    
    	//string hello("hallo"); geht nicht???(string nicht deklarierter Bezeicher)
    	//char search[7];
    	//int k=0;
    	//do
    	//{
    	//strcpy(search[k],cFile[k]) // geht ja nicht, weil beides char... oder?
    	//k++;
    	//}while(k<7);
    
            // Jetz soll die Zeile in der Textdatei gefunden werden, in der search[0 bis 7] vorkommt
            // und die jeweilige Zeile durch m_carspec ersetzt werden...
    
    	fclose(FDatei);					// Datei schliessen
    
    	MessageBox(cFile[30]);			// Nur mal so zum testen, ob die Textdatei fehlerfrei eingelesen wurde
    	UpdateData(FALSE);
    
    }
    

    In diesem Status treten keine Fehler oder Warnungen auf und die Datei wird einwandfrei eingelesen. Über "MessageBox(cFile[30]); " bekomm ich die jeweilige Zeile angezeigt.

    Nur den (im Moment auskommentierten) Teil nach dem Dateieinlesen versteh ich net so ganz. Ich wollte eigentlich die ersten 8 zeichen vom carspec in einen neuen string kopieren und diesen dann dazu benutzen, in der textdatei Zeile für Zeile nach dem Suchwort zu suchen. Aber ich kann noch nicht mal strings deklarieren, obwohl string und cstring.h included sind. Ich weiß nicht mehr weiter.

    Ich hoffe auf euren guten Rat 😉



  • Um die Klasse string aus der STL zu verwenden, must Du (am besten in der stdafx.h) den Header inkludieren.

    #include <string>
    

    Dann kannst Du über std::string die Stringklasse aus der STL verwenden.

    Oder du schreibst in der cpp-Datei, in der Du die Strings verwendest
    folgendes:

    using std::string
    

    Dann brauchst Du die Strings nicht extra mit std::string angeben.

    Du kannst auch in der stdafx.h hinter dem include eine Typdefinition
    angeben um z.B. auch Unicode zu unterstützen:

    #ifdef _UNICODE
    typedef std::wstring TString
    #else
    typedef std::string TString
    #endif
    

    Danach steht Dir TString in deinem Programm zur Verfügung.

    Noch besser allerdings, verwendest Du statt der STL-Strings die MFC-Strings.

    Die heissen CString und sind ab VC2003 genausogut, und innerhalb der MFC
    viel praktischer.

    Gruss
    EB



  • Erstmal danke für die prompte Antowrt 👍

    EB schrieb:

    Um die Klasse string aus der STL zu verwenden, must Du (am besten in der stdafx.h) den Header inkludieren.

    #include <string>
    

    Ja, schon klar, hab ich ja auch gemacht: "obwohl string und cstring.h included sind". Das versteh ich ja grad nich, weil er mir trotzdem sagt, dass string ein nicht deklarierter Bezeichner sei... mit CString hab ich es auch schon probiert, mit dem selben Fehler...

    EB schrieb:

    Oder du schreibst in der cpp-Datei, in der Du die Strings verwendest
    folgendes:

    using std::string
    

    Da bringt er mir 6 Fehler, angeführt von "'std' : Keine Klasse oder Namespace"
    😡

    EB schrieb:

    Du kannst auch in der stdafx.h hinter dem include eine Typdefinition
    angeben um z.B. auch Unicode zu unterstützen:

    #ifdef _UNICODE
    typedef std::wstring TString
    #else
    typedef std::string TString
    #endif
    

    ääähm ja...
    Also das ganze muss in die stdafx.h?
    und dann? Schreib ich dann für die Variablendeklaration z. B. "TString hello("hello!");" ?

    EB schrieb:

    Noch besser allerdings, verwendest Du statt der STL-Strings die MFC-Strings.

    Die heissen CString und sind ab VC2003 genausogut, und innerhalb der MFC
    viel praktischer.

    die cstring.h hab ich ja included aber wenn ich meine Variable deklarieren will, kommt immer "nichtdeklarierter Bezeichner" das ist es ja was ich nicht verstehe... ICh hab hier so 2 schöne C++ Büchlein rumliegen, die mir aber leider nicht viel weiterhelfen 😞



  • Wenn Du eine MFC Anwendung hast (wovon ich ja ausgehe, sonst würdest Du hier ja nicht posten), dann hast DU schon per default alles korrekt includiert und kannst direkt

    CString str(_T("Hallo"));
    

    verwenden.
    Und wenn Du schon MFC hast, dann solltest Du auch CFile verwenden um eine Datei zu lesen...
    Siehe: Files in MFC
    http://msdn2.microsoft.com/ey6xh9bk

    Oder was ist Dein Problem?




Anmelden zum Antworten