HILFE! Strings<->char*?
-
Hallo, ich brauche unbedingt so schnell wie es geht Hilfe! Bin ein absoluter Anfänger und ziemlich verwirrt:
Ich möchte den Benutzer einen Pfad eingeben lassen, und die entsprechende Datei dann öffnen. Nur benutze ich für die Pfadeingabe ein String-Objekt,
und das kann ich dann nicht zum Öffnen benutzen! Es kommen immer Fehlermeldungen. Ich hab schon probiert zu casten, aber nichts geht.string pfad;
cin >> pfad;
ifstream file(pfad); <-- Geht nicht!
if (!file) cerr << "ERROR";und char *test = pfad ect. geht auch nicht
Wie kann man das umgehen? Bin ich zu blind?
Vielen Dank für schnelle Hilfe,
spl@t
-
Versuch mal path.c_str()
-
"c_str()" gibt ein char pointer auf den Anfang des Strings als Konstante zurück.
Wenn du "data()" nimmst kannst du den String auch beschreiben. Sei aber vorsichtig, der string weiß nicht bescheid ob da jemand über seine Grenzen schreibt. Verwende daher die Funktion "reserve" um Speicher für den String zu reservieren.
-
data gibt ebenfalls einen Zeiger auf const zurück.
-
Ops, mein Fehler...
Hab außerdem falsch gedacht. Ich dachte man kann den String nicht manipulieren wenn man einen const char pointer erhält. Dabei bewirkt das Schlüsselwort const ja nur, dass die Pointer Variable selbst unveränderbar ist (weils ein Attribut in der Klasse ist?).
-
data gibt ebenfalls einen Zeiger auf const zurück
const E * basic_string::data() const;
c_str() und data() geben nen pointer auf eine konstante zeichenkette (const char
zurueck, also nicht beschreibbar !
Und prinzipiell wuerdest damit auch dein stringobject kaputtmachen, weil die Laengen uberhaupt ned mehr uebereinstimmen. std:: string ist was anderes wie char * ! bzw. in vielen situationen verhaelt es sich (leider) andersEiner der Gruende, warum die STL Strings in kooperation mit anderen Libs nen greul sind. In den meisten faellen kommt man besser, wenn man die eigenen Stringwrapper der libs benutzt (CString, QString ... etc)
Ciao ...
-
*c_str() und data() geben nen pointer auf eine konstante zeichenkette (const char ) zurueck, also nicht beschreibbar !
Ok den Fehler habe ich schon eingestanden
Und prinzipiell wuerdest damit auch dein stringobject kaputtmachen, weil die Laengen uberhaupt ned mehr uebereinstimmen.
Du meinst es würden mehrere Null-Zeichen im String erscheinen? Das würde aber nur passieren wenn man Funktionen verwendet, die z.b. einen Buffer verlangen und den mit einem Null-Zeichen terminieren. Versteh' ich's falsch oder wie meinst du das genau?
-
Ok den Fehler habe ich schon eingestanden
klang eher so, als waer dir nich klar, das der string das ned zulassen will, das du in seinem puffer rumschreibst
Sorry, wenn ich das falsch interpretiert habe
jupp genau ...
der std::string fuehrt extra seine laenge mit ... den intresssiert die Null termination nicht.
normal kein problem, wenn du string.c_str() wieder an funktion uebergibst, die nen konstanten zeiger auf nen nullterminierte zeichenkette erwartet. aber alle funktionen die std::string uebernehmen, wuerden dir muell ausgeben ... und genau so wuerde das aneinanderhaengen nimmer funzen ...Ciao ...
-
Hiho, vielen Dank für die schnelle und ausfürliche Hilfe!
Habs gleich nachdem der erste Beitrag da war ausprobiert und es hat tadellos geklappt! Und weil ich dann so im Programmieren versunken war, konnte ich auch nicht gleich antworten
Leider konnte ich zwar nicht alle Probleme damit lösen, Inkompatibilitäten von std::string und char* musste ich also bis jetzt auch schon feststellen.
(Hab z.B versucht, nen String zu erstellen indem ich in einer Schleifen mit std::strcat immer ein char eines chararrays anhängen wollte... -> MÜLL)
Nuja, weil ich mich insgesamt zu wenig mit dem Kram auskenne verwende ich jetzt einfach vorläuig chararrays und schreib mir die Funktionen selbst
Aber ich glaub ich schweife ab...