wfstreams ...



  • Hiho,
    ich versuche mich gerade ein bisschen an Unicode,
    und naja, hab gleichschonmal ein paar Probleme.
    Zur Zeit mache ich eine Funktion die dateien (die ini ähnlich aufgebaut sind), einzuliest.
    So, das ganze nur halt jetzt mit wfstreams und wstrings ...
    Die Sache:
    Wenn ich jetz die Zeile
    "[Group2]" einlese, (und testweise per Konsole ausgeb'),
    steht da: " [ G r o u p 2 ]"
    Nur wenn ich das mit einem string vergleichen will der so initilisiert wurde:
    wstring bla = L"Group2";
    haut das hint und vorn nich hin, denn wenn ich testweise in der Konsole bla (mit wcout) ausgeb', steht das ganze so da wie ichs eingegeben hab (also ohne Leerräume dazwischen).
    Da ich in dem Bereich noch absoluter Neuling bin (also was Unicode angeht), hab ich auch keine Ahnung was es für Funktionen, Befehle etc. gibt die man nutzen könnte (ich muss auch sagen das ich entweder zu blöd zu suchen bin, oder es ist absolut schlecht dokumentiert im Internet ...).

    Dann die zweite Frage:
    Ich lese die Datei ja zeilenweise aus (per getline() ..),
    in der ersten Zeile steht immer eine Art "merkwürdriges" Zeichen (sehr schwammig ich weiss ^^), ich wollt eigentlich nur wissen was das bei Unicode Dateien zu bedeuten hat (dieses extra Zeichen ganz am Anfang).

    Dann hoff' ich mal auf gaaanz tolle Antworten 😉

    mfg

    k1ro



  • Ad erste Frage: Zeig mal Code her. Anders können wir dir nicht helfen.

    Ad zweite Frage: Wenn du mit WordPad einen Text als Unicode-Text abspeicherst wird zusätzlich ein Word (16 Bit) am Anfang der Datei abgespeichert. Ich hab mal auf experts-exchange.com eine Erklärung darüber gelesen, aber ich hab leider vergessen wie ich zu dieser Seite wieder komme...



  • hm, ist code wirklich notwendig ?
    ich denke ich hab hier alles genau geschildert ...

    naja, ok, (zeig zwar ungern her, weil ich denk das er mies is 🙂

    bool FindGroupW(wfstream& file, const wstring& szGroup)
    {
    	bool success=false;
    
    	wstring ReadString;
    	while (getline(file, ReadString)) {
    		if (ReadString.at(1) != L'[') {
    			continue;
    		}
    		if (ReadString.find(szGroup)) {
    			success=true;
    			break;
    		}
    	}
    	return success;
    }
    
    wstring GetNextWordW(wstring::size_type& start, const wstring& szText, wchar_t stopmark)
    {
    	wstring word(L"");
    	wstring::size_type pos = szText.find_first_of(stopmark,start);
    	word = szText.substr(start,pos);
    	start = pos;
    	return word;
    }
    
    bool storage::GetFileStringW(const string& szFile, const wstring& szName, const wstring& szGroup,
    							 wstring& szValue)
    {
    	wfstream file(szFile.c_str(), ios_base::in|ios_base::binary);
    
    	if (!file) {
    		file.close();
    		BS_SetLastError(file_not_found);
    		return 0;
    	}
    
    	bool succees=false;
    
    	if (FindGroupW(file, szGroup)) {
    		wstring::size_type pos=0;
    		wstring ReadString;
    		while(getline(file, ReadString)) {
    			if (!_wcsnicmp(L"[",ReadString.c_str(),1)) {
    				szValue=L"";
    				BS_SetLastError(not_found);
    				succees = false;
    				break;
    			}
    			else if (GetNextWordW(pos,ReadString,'=')==szName) {
    				szValue = ReadString.substr(++pos,ReadString.length()-2);
    				succees = true;
    				break;
    			}
    			else if (pos!=0)
    				pos = 0;
    		}
    	}
    	file.close();
    	return succees;
    }
    


  • Eine Funktion hab ich schon kapiert 😉 (die sollte auch problemlos funktionieren)
    Bevor ich weiter mache, wollte ich fragen ob du die Symbole "_UNICODE" und "UNICODE" in deinem Code oder den Einstellungen deiner Entwicklungsumgebung definiert hast?



  • Aziz schrieb:

    Eine Funktion hab ich schon kapiert 😉 (die sollte auch problemlos funktionieren)

    lol :D,

    Aziz schrieb:

    Bevor ich weiter mache, wollte ich fragen ob du die Symbole "_UNICODE" und "UNICODE" in deinem Code oder den Einstellungen deiner Entwicklungsumgebung definiert hast?

    hm, hab in meiner main.cpp zumd. #define UNICODE stehn 🙂

    Aber is das denn Global wichtig, da ich eh explizit wstreams, wstrings und bei literalen das L verwende (mehr eine Interessensfrage als eine Ausrede sich zu darum zu drücken 🙂 )



  • Wenn Funktionen in einer Header-Datei in der char- und wchar-Version verfügbar sind, dann wäre es wichtig vor dem Inkludieren der Header zu definieren ob man die Unicode-Versionen benutzen will oder nicht.
    Sobald du aber einer char-Funktion einen Unicode-String übergibst würde sich der Compiler sofort aufregen...



  • in meiner header für die funktion steht:

    #ifdef UNICODE
    #define GetFileString GetFileStringW
    #else
    #define GetFileString GetFileStringA
    #endif
    

    an das hab ich schon gedacht, hilft mir aber bei meinem problem gerade wenig weiter 😕

    btw. zum testen ruf ich auch explicit die W funktion auf und übergeb auch demenstprechende variablen



  • Ich versuche gerade deinen Code zu kompilieren. Kannst du mir sagen welche Header-Dateien du inkludiert hast?

    Mein Compiler regt sich bereits wegen der getline Funktion auf. (Ich hab bereits iostream und string inkludiert)



  • #include <fstream>
    

    (header für die fstreams 🙂 )

    btw. ich hab mit notepad eine kleine test.ini geschrieben,
    und un UNICODE abgespeichert.
    die datei sah so aus:

    [Group1]
    Eintrag1=Test1
    Eintrag2=Test2
    Eintrag3=Test3
    [Group2]
    Eintrag1=Test4
    Eintrag2=(japanische zeichen)
    Eintrag3=Test5
    


  • Wieso kann der Konstruktor von "wfstream" keinen wstring als ersten Parameter annehmen? Das ist ja ein Witz..



  • weil Dateinamen in Unicode nich funktionieren ...

    (wieso auch immer, in Windows kann ich ohne Probleme eine neue Datei mit Unicode Zeichen in der Bennenung erstellen ..)



  • k1ro schrieb:

    Wenn ich jetz die Zeile
    "[Group2]" einlese, (und testweise per Konsole ausgeb'),
    steht da: " [ G r o u p 2 ]"

    Zeig mal die Ausgabe auf der Konsole und den Vergleich mit der wstring Konstante.



  • Optimizer schrieb:

    Zeig mal die Ausgabe auf der Konsole und den Vergleich mit der wstring Konstante.

    wenn du das meinst was ich meine das du meinst dann hab ich das bereits gesagt.

    hier nochmal:

    wenn ich den wstring szGroup den ich übergebe (in dem "Group2" drinne steht) ausgebe mit wcout, dann steht in der konsole
    "Group2",
    wenn ich die per getline bekommene Zeile ausgebe steht
    " [ G r o u p 2 ]" da.



  • ich hab mal kurz die FindGroupW-Funktion folgendermassen verändert:

    bool FindGroupW(wfstream& file, const wstring& szGroup)
    {
    	bool success=false;
    	wcout << L"szGroup: " << szGroup << L'\n';
    	wstring ReadString;
    	while (getline(file, ReadString)) {
    		//if (ReadString.at(1) != L'[') {
    		//	continue;
    		//}
    		wcout << L"ReadString: " << ReadString << L'\n';
    		//if (ReadString.find(szGroup)) {
    			//cout << "found\n";
    			//success=true;
    			//break;
    		//}
    	}
    	return success;
    }
    

    hier dann der konsolen output:

    szGroup: Group2
     eadString: ■[ G r o u p 1 ]
     eadString:  E i n t r a g 1 = T e s t 1
     eadString:  E i n t r a g 2 = T e s t 2
     eadString:  E i n t r a g 3 = T e s t 3
     eadString:  [ G r o u p 2 ]
     eadString:  E i n t r a g 1 = T e s t 4
     eadString:  E i n t r a g 2 = T e s t 5
     eadString:  E i n t r a g 3 = o0X0ü0~0W0f0
    ReadString:  E i n t r a g 4 = T e s t 7
    

    Was mich jetz auch noch wundert is das er das "R" bei "ReadString" verschluckt 😕

    Edit: Hier noch der Link zur Test-Datei die ich benutz (is glaub ich ganz nützlich ^^): http://www.binarystudios.de/k1ro/boards/cpp/testw.txt
    (btw. unter ie, schaff ichs komischerweise nich den Link zu öffnen, unter FireFox gehts tadelos...)


Anmelden zum Antworten