Funktion zum ändern einer Dateiendung
-
Hallo liebe c-plusplus.net Community,
zuersteinmal möcht ich kurz meinen Momentanen Code posten.
void Path::ChangeExtension(const wchar_t strPath[MAX_PATH], const wchar_t strExtension[MAX_PATH]) { wchar_t resultPath[MAX_PATH]; if (path_too_long(strPath, strExtension)) return; int len = wcslen(strPath); int index = len; for (index = len; index != 0; index--) { if (strPath[index] == '.') { break; } } if (index != 0) { wcsncpy_s(resultPath, strPath, index); wcscat_s(resultPath, strExtension); } else { wcscpy_s(resultPath, strPath); wcscat_s(resultPath, L"."); wcscat_s(resultPath, strExtension); } return; }Diese Funktion soll dasselbe erfüllen wie System.IO.Path.ChangeExtension(), und ist Teil meiner Filesystem Klasse. Ich suche nun nach einer Möglichkeit, den resultPath zu returnen. Ich habe versucht ihn einfach direkt zu returnen, was aber nicht funktionierte... Ich wäre für einen guten Lösungsvorschlag sehr dankbar!

Mit freundlichen Grüßen,
Soulzter
-
Sieht wie C aus.
Da das aber der C++-Bereich ist:std::wstring.
-
aber die Funktionen nehmen ja wchar_t's an und keine wstrings.
-
Was hat das damit zu tun, was DEINE Funktion annimmt, bzw. zurückgibt?
-
Heißt das also, ich kann meine Klasse praktisch komplett mit wstrings coden, muss aber jeweils den member c_str() benutzen, um die wstring's dann in die für die einzelnen c funktionen nötigen wchar_t's zu konvertieren?
Das wäre natürlich absolut kein Problem, allerdings würd ich gerne noch ne Möglichkeit wissen, wie ich das ganze mit den C Strings (wchar_t) lösen kann.
Dann würde ich nämlich jeweils 2 Funktionen schreiben, von denen die eine die wstrings frisst und die andere Funktion dann die wchar_t's.
-
Soulzter schrieb:
Dann würde ich nämlich jeweils 2 Funktionen schreiben, von denen die eine die wstrings frisst und die andere Funktion dann die wchar_t's.
Und was bringt das?
Arrays sind mühsam. Das merkst du alleine schon daran, dass du sie in deiner Funktion nicht als Rückgabetypen verwenden kannst. Und du musst dich auf eine willkürliche Länge
MAX_PATHfestlegen. Zudem befinden sich die ganzen_s-Funktionen nicht im C++-Standard.
-
Also sollte ich schauen, dass ich mit ner referenz in der funktion arbeite. Richtig?
Ich soll aber die _s Funktionen benutzen, um die ganzen unsafe-warnungen zu umgehen, die mir mein Compiler ausgibt. Das müsste doch heißen, solange man auf Windows als Platform bleibt, sind die _s Funktionen kein Problem, richtig?
-
Soulzter schrieb:
Also sollte ich schauen, dass ich mit ner referenz in der funktion arbeite. Richtig?
Nein. Du übergibst ja schon Zeiger, auch wenn sie in der Parameterliste wie Arrays aussehen.
Soulzter schrieb:
Ich soll aber die _s Funktionen benutzen, um die ganzen unsafe-warnungen zu umgehen, die mir mein Compiler ausgibt.
"unsafe" kommt daher, wenn du über den Puffer hinausschreibst, also dir nicht über die Stringlängen im Klaren bist. Du legst dich dabei immer auf eine bestimmte (willkürliche) Länge fest.
Das sind wiederum alles Probleme, die man mit
std::wstringnicht hat... Überhaupt hättest du einen Bruchteil des Codes, wenn du die Memberfunktionenrfind()undreplace()verwenden könntest.
-
Birgt nicht std::wstring einen gewissen Geschwindigkeitsverlust?
Und lässt sich std::wstring genau so mit MAX_PATH als Länge initalisieren?
-
Soulzter schrieb:
Birgt nicht std::wstring einen gewissen Geschwindigkeitsverlust?
Die dynamischen Allokationen sind vielleicht etwas langsamer. Aber ich habe sehr grosse Zweifel, dass es bei dir genau auf diesen Unterschied ankommt, sodass sich hässlicher Code deswegen lohnen würde.
Soulzter schrieb:
Und lässt sich std::wstring genau so mit MAX_PATH als Länge initalisieren?
Grundsätzlich ja, aber da
MAX_PATHnur notwendiges Übel ist, um keine Pufferüberläufe zu haben, ist das gar nicht nötig.std::wstringreserviert sich den benötigten Speicherplatz automatisch.
-
Und ich kann std::wstring von der Funktion ausgeben lassen, ohne es nachher mit delete oder free "töten" zu müssen, richtig?
Das heißt ich brauche mich nicht um eine Garbage Collection kümmern?
-
Soulzter schrieb:
Und ich kann std::wstring von der Funktion ausgeben lassen, ohne es nachher mit delete oder free "töten" zu müssen, richtig?
Richtig. Das ist ein wesentlicher Vorteil von Containern.
Du kannst
std::wstring-Objekte auch normal kopieren, zuweisen, an Funktionen übergeben und von ihnen zurückgeben. All die Spezialbehandlungen und impliziten "Features" von Arrays entfallen, du hast ganz normale Wertsemantik wie z.B. beiint.
-
Okay besten Dank!
Damit hast du mir sehr geholfen!