Forum: PC-Programmierung String^ nach const char* konvertieren


von MostWantedprogrammer (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Mark .. (mork)


Lesenswert?

Weis zwar nich ob das geht, aber versuchs mal mit &path[0] bei der 
Parameterübergabe.

von MostWantedprogrammer (Gast)


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

von Sebastian (Gast)


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.

von Markus V. (valvestino)


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

von Markus (Gast)


Lesenswert?

Wenn du schon mit VC2005 programmierst. Warum nicht managed ?
Probier mal File::Open().
Dein String ist auch schon ein managed Objekt.

von Markus V. (valvestino)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Seeehr schön. Das lässt den Hass der klassischen un-managed 
C-Programmierer nochmal etwas weiter schüren ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bietet "mangled C++" eigentlich auch irgendwelche Vorteile?

von Εrnst B. (ernst)


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.

von MostWantedprogrammer (Gast)


Lesenswert?

Danke für eure Antworten,

es klappt jetzt.

Gruß

MostWantedprogrammer

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.