Probleme mit Strings und deren Konvertierung
-
Hallo Leute,
ich bin recht neu in c++ und habe davor vor allem mit Java und VB gearbeitet.
Deswegen bin ich bei der Typenkonvertierung sehr verwöhnt.Bin mir auch nicht sicher, ob ich hier richtig bin, denn ich nutze bei dem Ganzen die Windows API dabei, wenn ich also falsch bin, schon mal ein Entschuldigung im vorraus.
Hab heute mal versucht, die Bilder meiner Digitalkamera mit c++ auszulesen.
Die sehen alle aus wie folgt: Img######.jgp wobei # = Ziffer.Den kompletten Dateinamen bekomme ich wunderbar raus, allerdings als wstring.
Nun sind für mich aber nur die ###### interessant, aber was ich auch versuche ich bekomme den string nicht klein. Zwar geht substr aber der Compiler mag meine Eingaben nicht.std::wstring getNumberOfFiles(string path) { std::wstring CmpFN = findFirstNamedFile(path); //gibt den kompletten Namen der Datei aus std::wstring PictureNumber; PictureNumber = (CmpFN.substr(CmpFN.find("0"), CmpFN.find("."))); return PictureNumber; }Zeile: "PictureNumber = (CmpFN.substr(CmpFN.find("0"), CmpFN.find(".")));" wirft immer wieder Fehler, obwohl ich schon jede mir bekannte Typenkonverierung versucht habe.
Wie ich schon sagte, bin noch noob, also bitte nicht nur ne Lösung, ich will wissen warum das so ist
-
Der zweite Parameter von
substrist eine Anzahl, keine Position.Da können Dateien sein, die gar keine "0" im Namen haben. Dann wirft
substreinout_of_range.Funktionen zum Auflisten von Dateien in einem Ordner liefern normalerweise die Pseudodateien "." und "..". Daran wird es liegen.
-
Eine Möglichkeit wäre zum Beispiel diese:
unsigned getNumberOfFiles(string path) { std::wstring CmpFN = findFirstNamedFile(path); //gibt den kompletten Namen der Datei aus std::wistringstream is(CmpFN); unsigned PictureNumber; while( !(is>>PictureNumber).eof() ) { if( !is ) { is.clear(); is.ignore(1); } } return PictureNumber; }
-
Dankeschön erstmal.
TyroXx : Jo, war Blödsinn beim substr is schon etwas spät.
die "Pseudodaten" filter ich raus, ebenso wie Unterverzeichnisse.@Gugelmoser: ich werds mal versuchen, aber wahrscheinlich komm ich dann wieder net mit unsigned klar

-
Obwohl das natürlich noch viel besser ist, da es ja in Wirklichkeit keine Zahl zum Rechnen ist:
std::wstring getNumberOfFiles(string path) { std::wstring CmpFN = findFirstNamedFile(path); //gibt den kompletten Namen der Datei aus unsigned begin_number = CmpFN.find_first_of(L"1234567890"); std::wstring PictureNumber = CmpFN.substr( begin_number, CmpFN.find('.') - begin_number ); return PictureNumber; }
-
Noch einmal danke.
Das funktioniert wunderbar.Jetzt möchte ich nur noch genau wissen, was denn mein Fehler war.
Also bei meinem Code kam immer die Fehlermeldung:
cannot convert from 'const char [2]' to 'const std::basic_stringliegt das nun wirklich nur an den vermischten Unicode- und Ansi- Glyphen?
Also Problem ist auf jeden Fall gelöst.
edit: OK, hab es rausgefunden, nun läuft meine Version auch ohne Probleme.