Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 20.02.2008, 21:15 Titel: wchar_t und \\ |
|
|
N'abend allerseits,
hab da mal ein kleines String-Problem, und zwar hab ich einen Dateipfad als wchar_t String. Sie in etwa so aus:
G:\___Projekte\SVN\ce_testapp\test.txt
So nu hab ich aber das Problem das der string so in manchen Funktionen als Datei unbrauchbar ist, da dort eigentlich der \ durch \\ ersetzt sein muss.
Wie krieg ich jetzt diesen String umgewandelt das er so aussieht:
G:\\___Projekte\\SVN\\ce_testapp\\test.txt
Einfach zeichenweise durchgehen scheitert schonmal daran, dass ich dem Vergleich den String "\" nicht übergeben kann ( es wird "\\" erwartet )
Danke schonmal für Ideen.... _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 21.02.2008, 16:40 Titel: |
|
|
OK, langsam:
Du hast einen wchar_t-String. Das ist ein String, wie jeder andere, eben in Unicode.
So. Nun willst du offensichtlich diesen String an eine Methode oder so übergeben.
Wenn ich das programmieren müsste, würde ich es folgendermaßen schreiben:
CPP: | int main()
{
CKlasse Obj;
Obj.Methode(L"G:\\___Projekte\\SVN\\ce_testapp\\test.txt");
return 0;
} |
Was er da an die Methode übergibt ist ja der Text "G:\___Projekte\SVN\ce_testapp\test.txt", weil die "\" ja nur Escape-Zeichen sind.
Hoffe mal, ich hab das Problem richtig verstanden.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 21.02.2008, 18:02 Titel: |
|
|
wenn du in einem string s alle "\" durch "\\" ersetzen willst, könntest du das folgendermaßen machen: CPP: | std::string::size_type pos = 0;
while( (pos = s.find('\\', pos+2) != std::sting::npos )
s.replace( pos, 1, "\\\\" ); |
Das geht in deinem Fall, ist generell aber unflexibel. Am besten ist, wenn du zuerst alle \ durch eine beliebige Platzhalterzeichenfolge (z.B "%BS%", da dies normalerweise nicht vorkamm ersetzt, da du dann eine Art "rekursive" Ersetzung nutzen kannst. Geht aber auch so.
Noch 2 Anmerkungen: in find() ist '\\' wegen des escape-Zeichens nur 1 Zeichen und zwar '\', deshalb die einfachen anführungszeichen. in replace dagegen ists "\\\\" was sich zu 2 Zeichen auflöst: "\\", deshalb doppelte Anführungszeichen.
Gruß DXer |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 21.02.2008, 21:29 Titel: |
|
|
DirectXer hat Folgendes geschrieben: |
CPP: | std::string::size_type pos = 0;
while( (pos = s.find('\\', pos+2) != std::sting::npos )
s.replace( pos, 1, "\\\\" ); |
|
Das könnte klappen, wenn du mir jetzt noch verrätst wie ich meinen "stinknormalen" wchar_t* in ein std::basic_string<wchar_t*> kriege und später wieder zurück... _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 21.02.2008, 21:34 Titel: |
|
|
Indem du:
CPP: | std::basic_string<wchar_t> s="C:\\...";
while( (pos = s.find('\\', pos+2) != std::sting::npos )
s.replace( pos, 1, "\\\\" );
|
machst.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 21.02.2008, 21:37 Titel: |
|
|
Denke nicht
CPP: | std::basic_string<wchar_t> s="C:\\..."; | can not convert from const char* to const wchar_t* L vergessen ... Aber Konstruktoren rocken!
Warum typedef std::wstring auflösen?
CPP: | std::wstring string(L"C:\\...");
while ((pos = string.find(L'\\', pos + 2) != std::sting::npos )
string.replace(pos, 1, L"\\\\" ); | |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 21.02.2008, 21:37 Titel: |
|
|
Leider hab ich aber meinen Dateipfad bereits als "normalen" wchar_t* string vorliegen, und einfach auf den basic_string<wchar_t> raufkopieren erreicht leider chaotische zustände... _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 21.02.2008, 21:39 Titel: |
|
|
schneidi74 hat Folgendes geschrieben: | Leider hab ich aber meinen Dateipfad bereits als "normalen" wchar_t* string vorliegen, und einfach auf den basic_string<wchar_t> raufkopieren erreicht leider chaotische zustände... |
Glaubst du nicht, dass es noch chaotischer wird, wenn du das selber machst? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 23.02.2008, 20:28 Titel: |
|
|
schneidi74 hat Folgendes geschrieben: | Leider hab ich aber meinen Dateipfad bereits als "normalen" wchar_t* string vorliegen, und einfach auf den basic_string<wchar_t> raufkopieren erreicht leider chaotische zustände... |
Wieso? Sowas sollte ohne Probleme gehen: CPP: | const wchar_t* wcstr = L"test";
std::wstring wstr( wcstr );
// bzw. std::wstring wstr = wcstr;, was aber bei manchen Compilern einen Deut langsamer sein könnte | Für Casts zwischen std::string und std::wstring kannst du den char_cast<> benutzen, den du hier im Forum (glaube FAQ) mit der Bordsuche finden kannst. Wenn du den brauchst und nicht findest / verstehst, kann ich dir auch meine Version anbieten.
Gruß DXer |
|
Nach oben |
|
|
|