String^ nach const char* konvertieren

Gast #764614
Lesenswert?

Hallo,
Ich programmiere mit VC++ 2005 Express edition .Net.
Ich habe folgendes Problem. Ich habe einen Dateipfad, den ich so 
ermittle:
1
String^ path;
2

3
path = Application::StartupPath + "Ordner1\\datei.txt";

so. Und jetzt will ich diese datei öffnen:
1
fopen_s(&txtfile,path,"w");

Das klappt nicht, da path ein String ist und der 2te Parameter von 
fopen_s ein const char* sein soll. Ok, verstehe ich. Jetzt habe ich 
schon gegoogelt, aber nur so etwas gefunden:
1
const char* pathchar = atol(path);

Aber irgentwie geht das auch nicht, der compiler zeigt mir dann immer 
die Fehlermeldung:

error C2664: 'atol': Konvertierung des Parameters 1 von 'System::String 
^' in 'const char *' nicht möglich

Ist denn der Befehl falsch, oder macht man das anders?

Gruß,
MostWantedprogrammer
Persönliche Seite #764619
Lesenswert?

atol macht in der Tat was ganz anderes, es wandelt einen übergebenen 
String in einen long (daher auch der Name: Ascii to Long).
Was Du suchst, ist eine der Stringumwandlungsfunktionen, die als Member 
von String angeboten werden müssten. Sowas in der Art wie 
String.toLPCTSTR oder String.GetBuffer ...

Keine Ahnung, welche da geeignet ist; ich verwende kein "Mangled C++" 
und folglich auch das .Net-Geraffel nicht.
Gast #764906
Lesenswert?

hi,
Also erstmal zu rufus' beitrag. Es ist mir schon klar, dass ich eine 
Stringumwandlungsfunktion brauche. Ich habe die header string 
eingebunden, aber die sache mit verwandten oder mit einer Ähnlichen 
funktion: String.toLPCTSTR oder String.GetBuffer gibt es nicht... Wird 
nicht angezeigt.

Und &path[0] als Parameter übergeben. Ich habs ausprobiert, aber es geht 
nicht. Du meins doch bei dem fopen_s das als Parameter, oder?

MostWantedprogrammer
Gast #764914
Lesenswert?

Managed- und Unmanaged-Code zu mischen ist immer eine heikle 
Angelegenheit.
Nimm besser die "FileStream" und "TextReader"/"TextReader"-Klassen aus 
dem System::IO Namespace, anstatt die Datei über die "alte" C-Lib zu 
öffnen.
#764930
Lesenswert?

@MostWantedprogrammer
Hast Du schon mal die Methode ToCharArray() der Klasse String in 
Erwägung gezogen? Allerdings gibt es einen Haken bei der Sache. Strings 
in .NET enthalten IMMER Unicode-Characters. Diese haben 16 Bit! Es ist 
jetzt die Frage, ob Deine fopen_s Funktion damit klar kommt. Ich würde 
mal sagen, daß nein. Du must also das Unicode-Array noch in ein 
char-Array konvertieren und vor allem mit einer ASCII-Null abschließen. 
Für die Konvertierung von Unicode nach char und umgekehrt gibt es unter 
Windows und auch unter .NET entsprechende Funktionen. Da müßtest Du 
vielleicht noch ein bißchen im MSDN forschen, Stichwort "Unicode, 
conversion macros". Die .NET-Variante müßte ich morgen mal im Büro 
nachschauen.

Gruß
Markus
#765427
Lesenswert?

Hier noch den "versprochenen Büro-Nachtrag":

Die .NET-Konvertierung von String nach byte und umgekehrt:
1
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
2
    byte[] fromString = encoding.GetBytes(stringToConvert);
3
    ...
4
    String fromByte = encoding.GetString(byteArrayToConvert,0,<anzBytes>);

<anzBytes> stellt die Anzahl der zu berücksichtigenden Bytes aus dem 
array dar. Ich habe mir eine Methode geschrieben, die die erste 
ASCII-Null sucht und deren Index zurückliefert (klassische 
strlen-Funktion von C). Ich weiß allerdings nicht mehr, ob bei der 
Konvertierung von String nach byte eine ASCII-Null angehängt wird.

Ich habe die Konvertierung mit der ASCIIEncoding-Klasse für den Aufruf 
von Funktionen aus Unmanaged-DLLs verwendet. Funktioniert gut. Ja, ich 
weiß mittlerweile auch, daß man sowas über das DllImport-Attribut 
implizit machen kann... ;-)

Gruß
Markus
#765734
Lesenswert?

Ohne jetzt .Net zu kennen, würd ich behaupten dass
1
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
falsch ist. Geht spätestens in die Hose, wenn jemand auf die Idee kommt 
Umlaute oder Sonderzeichen in den Dateinamen zu packen.

Wenn schon .NET, dann machs richtig, und nimm für den Filezugriff auch 
die dafür vorgesehenen Klassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren