wchar_t* dursuchen
-
hallo,
ich hab mir mit
file= new wchar_t[++Size];
platz für eine zeichenkette gespeichert, in dieser zeichenkette steht jetzt ein dateiname drin inkl. dem pfad.
ich suche jetzt einen weg, wie ich die variable file nach "/" dursuchen kann, um so herauszufinden wo der letzte slash steht, damit ich den dateinamen extrahieren kann.
allerdings komme ich mit dem typ der variable nicht so ganz klar. wie kann ich den jetzt jedes einzelne zeichen durchsuchen? müsste doch im grunde ein pointer auf ein array sein?
mit file[0] kann ich aber z.b. nicht drauf zugreifen.
jemand nen tipp.
-
Wieso solltest du mit file[0] nicht zugreifen können? Was ist der Fehler? Ansonsten kannst du es auch mit einem STL-Algorithmus machen:
#include <algorithm> #include <iterator> // ... typedef std::reverse_iterator<wchar_t*, wchar_t> iter_type; iter_type rbegin (file + Size - 1); iter_type rend (file - 1); wchar_t* slash = std::find (rbegin, rend, L'/').base ();Gut, das ist so nicht wirklich elegant, aber ich habe zuerst überlesen, dass der letzte Schrägstrich gesucht wurde

-
Blanke Zeiger sind immer ein Problem, deshalb würde ich vermutlich eher einen wstring anstelle des Arrays verwenden (dort kannst du mit rfind() das letzte Vorkommen eines Teils suchen).
Wenn du unbedingt nackte wchar_t*s verwenden willst, die wchar-Version von strrchr() nennt sich
wcsrchr().
-
.filmor schrieb:
Wieso solltest du mit file[0] nicht zugreifen können? Was ist der Fehler? Ansonsten kannst du es auch mit einem STL-Algorithmus machen:
#include <algorithm> #include <iterator> // ... typedef std::reverse_iterator<wchar_t*, wchar_t> iter_type; iter_type rbegin (file + Size - 1); iter_type rend (file - 1); wchar_t* slash = std::find (rbegin, rend, L'/').base ();Gut, das ist so nicht wirklich elegant, aber ich habe zuerst überlesen, dass der letzte Schrägstrich gesucht wurde

ich bin sicher das funktioniert, aber ich peile nicht was du da machst....
was alles macht diese anweisung
typedef std::reverse_iterator<wchar_t*, wchar_t> iter_type;ist das ein iterator für 2 datentype gleichzeitig, also pointer auf ein wchar_t und wchar_t ?!?
wieso funktirt das: iter_type rbegin (file + Size - 1); iter_type rend (file - 1);müsste da nicht noch irgendwo ein "=" zeichen hin?
-
hunni schrieb:
ich bin sicher das funktioniert
Ich nicht

hunni schrieb:
was alles macht diese anweisung
typedef std::reverse_iterator<wchar_t*, wchar_t> iter_type;ist das ein iterator für 2 datentype gleichzeitig, also pointer auf ein wchar_t und wchar_t ?!?
Das ist keine Anweisung, sondern eine Datentypdefinition und -deklaration durch das typedef. Das ist eigentlich nicht unbedingt, aber ich dachte, der Code wird so klarer ;).
std::reverse_iterator ist ein Template aus der Standardbibliothek, dass einen Iterator "umdreht" (also in die andere Richtung laufen lässt, ++ <=> --). Und das braucht nunmal Informationen, um welchen Iteratortyp es sich handelt und (aus mir unerfindlichen Gründen, weil iterator_traits das auch weiß) welcher Typ bei *it zurückkommt.hunni schrieb:
wieso funktirt das:
iter_type rbegin (file + Size - 1); iter_type rend (file - 1);müsste da nicht noch irgendwo ein "=" zeichen hin?
Nein, hier wird nur der Konstruktor aufgerufen, das geht auch mit Klammern (die man bei mehr als einem Argument eh benutzen muss).