Umstieg von char* auf string



  • 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 😉


Anmelden zum Antworten