mikrocontroller.net

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


Autor: MostWantedprogrammer (Gast)
Datum:

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

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

so. Und jetzt will ich diese datei öffnen:
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:
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark .. (mork)
Datum:

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

Autor: MostWantedprogrammer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

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

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch den "versprochenen Büro-Nachtrag":

Die .NET-Konvertierung von String nach byte und umgekehrt:
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    byte[] fromString = encoding.GetBytes(stringToConvert);
    ...
    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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bietet "mangled C++" eigentlich auch irgendwelche Vorteile?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne jetzt .Net zu kennen, würd ich behaupten dass
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.

Autor: MostWantedprogrammer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten,

es klappt jetzt.

Gruß

MostWantedprogrammer

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.