Seite 1 von 1

[STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 24.04.2009, 17:50
von dowhilefor
Hallo,

ich musste mein aktuelles Projekt für die Lokalisierung von std::string auf std::wstring umstellen. Das meiste hat auch gut geklappt nur 2 Stellen scheinen irgendwie nicht zu funktionieren.

Die ersten

Code: Alles auswählen

std::vector<std::wstring> names;
names.push_back(L"Bob");
// ... noch mehr namen
for(int i = 0; i < names.size(); i++)
	std::wcout << names[i] << std::endl;
gibt nichts aus, nichtmal ein newline. Schreibe ich anstelle von names direkt L"Bob" passiert auch nichts, schreibe ich nur "Bob" gibt er es brav aus.

Das nächste Problem hängt mit wostringstream zusammen

Code: Alles auswählen

std::wostringstream stream;
stream << std::setfill(L'0') << std::setw(2) << (i + 1) << L" " << names[i]; // Ergebnis sollte sowas sein wie "01 Bob"
// mach was mit stream.str()
stream.str(L"");
Ergebnis hier ist nur eine 0 Sprich der erste Fill Char, aber nicht mehr...

Auch verstehe ich nicht so ganz den unterschied zwischen .size() und .length() bei std::string bekomme ich so die länge vom String, aber bei den Name kommt nicht nachvollziehbares herraus bspw. für L"Bob" size = 40.
Betriebsystem ist MacOSX das ganze in XCode.

Kann mir jemand weiterhelfen?
Danke schonmal
Nico

Re: [STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 24.04.2009, 18:20
von Biolunar
Das Problem kann ich nicht nachvollziehen. Es funktioniert wie gewollt mit gcc-4.3 unter Linux 2.6.29, da der Code auch so korrekt ist.

Die beiden Funktionen std::basic_string::length() und std::basic_string::size() sind äquivalent.

Re: [STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 24.04.2009, 18:23
von dowhilefor
Was ich dazusagen sollte ist, das ich aufgrund einer Bibliothek dem gcc folgendes compiler flag mitgegeben habe -fshort-wchar, sprich ich wchar zu einem short umwandle.

Re: [STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 24.04.2009, 18:29
von Biolunar
Oha. Das hat bei mir auch alles verändert. L"Bob" hat nun die größe 10 anstatt 3 und der andere Code gibt nen Segfault. Bei sonstigen Ausgaben kommt zwar was raus, aber nur Unfug und nichts lesbares...

Re: [STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 24.04.2009, 20:19
von dowhilefor
Deckt sich mit meinen Erkentnissen, ich bin jetzt wieder dazu übergangen das Flag wegzulassen und an den stellen wo die Bibliothek wstrings erwartet auf unsigned short zu wrappen, funktioniert soweit ... ärgerlich trotzdem.

Re: [STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 25.04.2009, 16:51
von Unknown GER
Beim ersten Beispiel ein ".c_str()" an die entsprechende Stelle setzen:
std::wcout << names.c_str() << std::endl;

Beim zweiten Beispiel den wostringstream mit L"" initialisieren:
std::wostringstream stream(L"");

edit: Das sind jedenfalls stellen über die ich manchmal stolpere (allerdings VS2008).

Re: [STL] wstring und wcout verhalten sich merkwürdig.

Verfasst: 25.04.2009, 17:18
von Biolunar
Das ist nicht von Erfolg geprägt. Einfach nur weil es das selbe ist ;)

Das Problem liegt an den Wide String Literalen. Immer wenn ich irgendwas in Anführungszeichen den Containtern einflöße, wird auf einmal size() gewaltig groß. std::wstring str; hat eine Größe von 0, std::wstring str(L"") hat bei mir aber 18... ohne den Compilerflag sind beide 0 wie es sein sollte. Wenn man die Chars einzelnd in den Container packt, dann stimmt die Größe sonderbarer Weise...