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, 0Ich 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.jpgvoid 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::stringDann 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 #endifDanach 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::stringDa 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/ey6xh9bkOder was ist Dein Problem?
-
Datei-Handling:
http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel3.htm