C++ _wrename

MarkP

Lieutenant
Registriert
Jan. 2016
Beiträge
653
Ich bin offensichtlich zu blöd aus einem std::wstring ein wchar_t* zu machen, aber ich sehe meinen eigenen Fehler nicht.
Darum sorry für die blöde Anfängerfrage, aber vielleicht hat Jemand Erbarmen mit mir?

wstring myoldname = L"D:\\Test\\oldfilename.txt";
wstring mynewname = L"D:\\Test\\newfilename.txt";

Laut MSDN muss ich einfach nur machen

_wrename( const wchar_t *oldname, const wchar_t *newname);

ergo muss ich "nur" wstring zu wchar_t konvertieren aber dabei stelle ich mich offensichtlich zu blöd an.
Was ich schon alles versucht habe erspare ich euch und mir selber auch, ist vermutlich einfach nur peinlich.
Nur ein Beispiel:

wchar_t oldname[myoldname.length()] = myoldname.c_str();

ergibt vom Compiler die Meldung "oldname may not be initialized" und der Befehl

int result = _wrename(oldname,newname);

gibt überhaupt nichts zurück, sondern crasht das Programm.
 
Zuletzt bearbeitet:
Blöde Frage vielleicht, aber die stdio.h oder wchar.h haste mit eingebunden? :)

edit War wirklich ne blöde Frage, sonst würde es ja garnicht kompilieren^^
 
Ich sag ja, zu blöd dazu.
_wcsdup und schon geht das.
Ganz vielen Dank für die schnelle Hilfe.
 
  • Gefällt mir
Reaktionen: Metalveteran
doofe Frage, würde das nicht auch funktionieren?

Code:
int result = _wrename(myoldname.str(),mynewname.str());

gibst du den Speicher bei _wcsdup auch wieder frei?
 
  • Gefällt mir
Reaktionen: kuddlmuddl
wstring ist ein Typ bzw. eine Klasse:
_wrename verlangt als Parameter einen Pointer „const wchar_t *“
um auf das Array von wstring zuzugreifen gibt es laut Klassenbeschreibung die Funktion „c_str()“

so wie mein Vorredner schon schrieb, sollte meines Erachtens auch ein Aufruf:
int result = _wrename(myoldname.c_str(), mynewname.c_str());​
funktionieren, dann kann man sich das Duplizieren und die Speicherfreigabe sparen

nur so'ne Idee
 
  • Gefällt mir
Reaktionen: kuddlmuddl
Topinambur schrieb:
sollte meines Erachtens auch ein Aufruf:
int result = _wrename(myoldname.c_str(), mynewname.c_str());funktionieren

Nein, auch das gibt vom Compiler die Meldung "cannot convert ....", weil .c_str() nicht const ist.

Speicher freigeben und so Feinheiten müssen mich nicht interessieren, das ist ein Winzig-Programm, was genau einmal ein Verzeichnis von ein paar 100 Dateien durchgeht, beim Auffinden bestimmter Zeichenfolgen irgendwo mitten im Namen diese Zeichen dort ausschneidet, sie ganz vorne im Dateinamen einsetzt, dann den rename macht und dann beendet wird.
Da räumt dann Windows automatisch auf.
 
Möglicherweise weil einer der schon seit 20 Jahren in Rente ist und nur noch hobbymässig Winzig-Programme für den Eigenbedarf schreibt keine Lust hat noch eine andere Programmiersprache zu lernen.
 
  • Gefällt mir
Reaktionen: kuddlmuddl
Welcher Compiler wird verwendet?
Das baut und läuft mit MSVC 19.39 ohne Probleme.
C++:
#include <iostream>
int main()
{
    std::wstring strA = L"D:\\foo.txt";
    std::wstring strB = L"D:\\bar.txt";
    _wrename(strA.c_str(), strB.c_str());
}
Const_cast als letzten Ausweg sonst auch schon versucht?
 
  • Gefällt mir
Reaktionen: kuddlmuddl und tollertyp
schade, warum es bei Dir nicht funktioniert, entzieht sich meiner Erkenntnis.
Laut Dokumentation liefert „c_str ()“ genau das, was „_wrename ( … ) benötigt
1715679502614.png
noch mehr const geht nun wirklich nicht.
 
  • Gefällt mir
Reaktionen: tollertyp
Ich schrieb "str()" und nicht "c_str()". Meinte natürlich c_str.
 
  • Gefällt mir
Reaktionen: kuddlmuddl
Zurück
Oben