Umstieg von char* auf string
-
Hallo!
Ich würde ganz gerne von char* auf string umsteigen(bin über Java auf den Geschmack gekommen!)! Nur da gibt es eine kleine Sache, die mir noch nicht ganz klar ist:
Viele C++-Routinen, wie z.B. open() aus der fstream.h, basieren auf char*.
Ist daher ein vollständiger Umstieg denn überhaupt möglich und sinnvoll?Ebenso war es mir bislang möglich Zeichenketten nach folgendem Prinzip aus Dateien zu lesen bzw. in Dateien zu schreiben:
char string[30]="Hallo!"; file->write(string,sizeof(string)); //analog dazu read
Ich kann ja somit beliebige Meldungen schreiben und lesen, ohne mir über die individuelle Zeichenkettenlänge Gedanken zu machen. Ich schreibe und lese immer
sizeof(string) Bytes, also soviele wie ich reserviert habe.Wie soll denn sowas jetzt bei string funktionieren?
Danke!
Grüße,
TS++
-
std::string bietet die Methode cstr, damit bekommst du einen Zeiger auf const char zurück und die Methode length die die Länge des strings ermittelt.
char x[30] = "Hallo"; //ups, Hallo\0 ist nur 6 Zeichen lang. Speicherverschwendung? char y[30]; cin >> y; //was wenn ein wort mehr als 30 zeichen hat?
std::string bietet alle Sicherheiten, die du dir wünschen kannst.
-
Danke für die Antwort!
Weil wir gerade dabei sind:
Noch ne kleine Frage:Ich hab sowohl bei VC++6 als auch beim BCB5 mal <string> über #include reinkopiert und eine kleine Testanwendung erstellt. Aber weder der eine noch der andere Compiler konnten etwas mit string anfangen.
Was mach ich denn noch verkehrt?Danke!
Grüße,
TS++
-
was meckern sie denn? (Fehlermeldungen?)
sowas muesste eigentlich immer gehen:
#include <string> #include <iostream> using namespace std; int main() { string str="Hallo, Welt!"; cout << str; return 0; }
-
Halt!!!
Kommando zurück!!!
Ich hätte lieber std::string anstelle von string schreiben sollen!
Komisch: der DevC++-Compiler hat auch string geschluckt!Na, ja! Wenigstens hat sich das jetzt erledigt!
Grüße,
TS++
-
Ich war gerade etwas langsamer als du.
VC++ und BCB melden mir, dass sie einen unbekannten Bezeichner string gefunden haben. Wenn ich std:: davorhänge geht's!
Wie du siehst:
Ich habe noch überhaupt keine Erfahrung mit der STL![ Dieser Beitrag wurde am 10.05.2003 um 17:54 Uhr von TS++ editiert. ]
-
Jetzt muss ich doch noch eine Frage nachreichen!
Wenn ich jetzt die Routinen write() und read(), wie bereits erwähnt, in Verbindung mit std::string verwende, so muss ich ja nach wie vor die Anzahl an Bytes angeben, die geschrieben oder gelesen werden sollen!
Das könnte ich ja beim Schreiben z.B. so realisieren:
std::string myString="Hallo!"; file->write(myString.c_str(),myString.length()+1); oder etwas mehr: file->write(myString.c_str(),myString.capacity());
Schön und gut:
Nur woher will ich beim Lesen wissen, wieviele Bytes an der aktuellen Stelle in der Datei einen String bilden?
Bei char* konnte ich ja einfach zum Beispiel 30 Bytes reservieren
(char myString[30]), eine Zeichenkette ablegen und 30 Bytes in die Zieldatei schreiben. Beim Lesen musste mir nur bekannt sein, dass von mir ursprünglich 30 Bytes an die aktuelle Position in die Datei geschrieben wurden. Ich lese also einfach 30 Byte ein.Wie ihr seht steh ich offensichtlich, was das eben geschilterte Problem anbelangt, immer noch auf dem Schlauch!
Bitte helft mir!
Danke!
Grüße,
TS++
-
du könntest einfach bevor der string anfängt einen int speichern, der die länge des nachfolgenden strings angibt
übrigens müsste es file->write(string.c_str(), string.length()) ohne das +1 heissen
-
also dieses read geht vermutlich nur mit char*, weil nach c_str() darfst du nicht schreiben.
aber normalerweise nimmt man dafuer ifstream und ofstream, dann z.b. so:string s; if(ifstream f("test.txt")){ getline(f,s); } if(ofstream f("testout.txt")){ f<<s<<endl; }
-
Nur was mach ich denn, wenn ich in meiner Datei Float-, Int-, BYTE- und viele weitere Werte sequentiell nacheinander abspeichere und es sich um keine TXT-Datei handelt. Dann nützt mir getline doch nichts, oder?!
-
Original erstellt von TS++:
Ich hätte lieber std::string anstelle von string schreiben sollen!
Komisch: der DevC++-Compiler hat auch string geschluckt!Dev-C++ ist kein Compiler sondern eine IDE und verwendet standardmäßig meines Wissens den g++ als Compiler und wenn der sich über ein fehlendes std:: nicht beschwert hast Du eine veraltete gcc-Version - wahrscheinlich 2.95.x statt 3.2.x.
-
wenn man oft einen char* braucht, dann sollte man sich überlegen ob man nicht vielleicht besser einen vector<char> statt einem string nimmt...
denn dann hat man mit
vec.begin()
bereits einen c-str (sofern man als letztes zeichen ein \0 hat)
-
Original erstellt von Shade Of Mine:
denn dann hat man mit
vec.begin()
bereits einen c-str (sofern man als letztes zeichen ein \0 hat)Kann man denn dann davon ausgehen, dass die alle sauber hintereinander im Speicher liegen???
-
Hi,
Ja, davon kann man ausgehen, da der Vektor aus einem Feld besteht, daß hintereinander im speicher liegt.
grüße Con@n
-
Ja, aber der Speicher ist dynamisch. Wenn neuer angefordert wird muss dieser doch nicht zusammenhängend sein, oder?
-
Original erstellt von MaSTaH:
Ja, aber der Speicher ist dynamisch. Wenn neuer angefordert wird muss dieser doch nicht zusammenhängend sein, oder?jein.
laut standard muss ein vector nicht inern als array aufgebaut sein, aber ein defekt report verlangt dies!und alle implementationen die ich kenne halten sich daran (es ist anders auch nicht vernünftig möglich einen vector nach STL vorgaben zu realisieren)
-
thx