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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

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

Beitrag 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
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

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

Beitrag 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.
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

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

Beitrag 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.
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

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

Beitrag 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...
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

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

Beitrag 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.
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Unknown GER
Beiträge: 49
Registriert: 09.01.2003, 13:04

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

Beitrag 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).
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

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

Beitrag 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...
Antworten