Mehrdeutige Operatoren, hash Map usw.
-
Hallo Zusammen,
leider hänge ich bei dem Code an ein Paar Stellen. Die Klasse soll es möglich machen eine Datei zu öffnen und von dort den Text zu IDs auszulesen. Dadurch soll es möglichst einfach sein, dem Programm mehrere Sprachen beizubringen. Die Textdatei muss Unicode-Zeichen aufnehmen.
Die Datei hat Format:
ID_XXX=textsoundso
ID_YYY=textblablaMein Problem ist jetzt, dass ich in Zeilen 79("=="), 94 und 95 (jeweils "=") mehrdeutige Operatoren vom Kompiler als Fehler bekomm.
Ich habe auch schon unterschiedliche Castings probiert (vielleicht nur falsch???), ohne Erfolg. Desweiteren würde ich gerne das Array, in dem ich die IDs und den Text speicher als hashmap realisieren. Ich habe zu Hash Map keine geeignete Anleitung auf Deutsch gefunden.Allgemeine Tipps sind natürlich auch willkommen. Schließlich will ich ja etwas lernen

Vielen Dank im Voraus für Eure Mühe.
#include "stdafx.h" #include "cstring" #include "Test2.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #ifndef _UNICODE #define _UNICODE #endif CWinApp theApp; using namespace std; class TxtToID { public: CString filename; CFile tempFile; CString tempString; int tempInt; int buffsize; bool hresult; TxtToID(); ~TxtToID(); int FileOpen(CString filename); int FileClose(CString filename); CString GetLang(); CString ReadLine(CString filename, int buffsize); CString GetTextForID(CString ID); CString TxtToID::CreateIDTxtArray(CString filename, int buffsize); }; int TxtToID::FileOpen(CString filename) { tempFile.Open(filename, CFile::modeRead); return 0; } int TxtToID::FileClose(CString filename) { tempFile.Close(); return 0; } CString TxtToID::GetLang() { CString Sprache, tempString; TxtToID TEMP; filename = "conf.ini"; buffsize = 50; TEMP.FileOpen(filename); CStdioFile tempCStdioFile; tempString = TEMP.ReadLine(filename, buffsize); while (tempString != "[Systemlanguage]") {tempString = TEMP.ReadLine(filename, buffsize);} tempString = TEMP.ReadLine(filename, buffsize); if (tempString.Find(_T("german"), 0)) {filename = "Properties_GER.txt";} else {filename = "Properties_ENG.txt";} return filename; } CString TxtToID::ReadLine(CString filename, int buffsize) { CStdioFile tempCStdioFile; hresult = true; tempString = tempCStdioFile.ReadString(filename.GetBuffer(buffsize), buffsize); filename.ReleaseBuffer(); if (tempString == false) {hresult = false;} return tempString; } CString TxtToID::CreateIDTxtArray(CString filename, int buffsize) { int n = 0; CString ID; CString IDTextArray[2][500]; FileOpen(filename); while(hresult) { IDTextArray[0][n] = ReadLine(filename, buffsize); tempInt = tempString.Find('=', 0); tempString = tempString.Right(tempInt); IDTextArray[1][n] = tempString.Delete(0); IDTextArray[0][n] = IDTextArray[0][n] - tempString; n++; } return ID; }
-
Sexymaxy schrieb:
Mein Problem ist jetzt, dass ich in Zeilen 79("=="), 94 und 95 (jeweils "=") mehrdeutige Operatoren vom Kompiler als Fehler bekomm.
Klar, wenn du einen CString mit einem bool vergleichst (an der Stelle wäre wohl
tempstring == ""passender) bzw. einen int-Wert zuweisen willst (versuch'S mal mitIDTextArray[1][n] = tempString.Mid(1);bzw. (keine Ahnung, was du mit Zeile 95 vorhast)).
-
Das ReadString liefert einen Bool, ob das einlesen der Zeile richtig ist. Ich habe es dann falsch interpretiert. Danke an dieser Stelle.
Mit der Zeile 95 möchte ich aus dem ID_XXX=Text das "=Text" abschneiden, so dass ich in [0][n] immer die ID und in [1][n] den Text stehen hab.
-
Erstmal solltest du die ganzen temp... Variablen nur dort deklarieren, wo du sie auch brauchst. (statt über (semi)globale Variablen Daten auszutauschen, nutz lieber Parameter und Rückgabewerte)
Auf der anderen Seite solltest du das Array "IDTextArray" als Member deiner Klasse anlegen, dann brauchst du es nur einmal einzulesen und anschließen nur noch darin zu suchen.Und zweitens ist die Zerlegung von Strings etwas komplizierter (da gibt es keinen op-, deshalb wandelt der Compiler beide Strings in char* um und berechnet die Zeiger-Differenz):
tempstring = ReadLine(...); pos = tempstring.Find("="); IDArray[0][n]=tempstring.Left(pos-1); IDArray[1][n]=tempstring.Mid(pos+1);PS: Drittens ist die ganze Berechnung in der CreateIDTextArray() sinnlos, weil das Text-Array am Ende sofort wieder gelöscht wird und ID während der Berechnung nicht angefasst wurde.
-
Vielen Dank. Jetzt funktionierts, wie gewünscht. Jetzt bleibt nur noch die Frage, wie ich am besten statt Arry Hash Map verwende.
-
Nimm doch einfach die map aus der STL. Oder meintest Du was anderes?