wfstreams ...



  • 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