Wie schreibe ich std :: string in eine Datei?

85

Ich möchte eine std::stringVariable, die ich vom Benutzer akzeptiere, in eine Datei schreiben . Ich habe versucht, die write()Methode zu verwenden, und sie schreibt in die Datei. Aber wenn ich die Datei öffne, sehe ich Kästchen anstelle der Zeichenfolge.

Die Zeichenfolge ist nur ein einzelnes Wort variabler Länge. Ist dafür std::stringgeeignet oder sollte ich ein Zeichenarray oder so verwenden.

ofstream write;
std::string studentName, roll, studentPassword, filename;


public:

void studentRegister()
{
    cout<<"Enter roll number"<<endl;
    cin>>roll;
    cout<<"Enter your name"<<endl;
    cin>>studentName;
    cout<<"Enter password"<<endl;
    cin>>studentPassword;


    filename = roll + ".txt";
    write.open(filename.c_str(), ios::out | ios::binary);

    write.put(ch);
    write.seekp(3, ios::beg);

    write.write((char *)&studentPassword, sizeof(std::string));
    write.close();`
}
Slashr
quelle
3
Bitte zeigen Sie Ihren Code. Im Allgemeinen ist dies bei korrekter Verwendung in std::stringOrdnung.
Nutzlos
2
Sie müssen den 'Nutzlast'-INHALT der Zeichenfolge speichern, nicht das Zeichenfolgenobjekt als solches (das normalerweise nur eine Länge und einen Zeiger auf den tatsächlichen Inhalt enthält)
Mats Petersson

Antworten:

119

Sie schreiben derzeit die Binärdaten im stringObjekt in Ihre Datei. Diese Binärdaten bestehen wahrscheinlich nur aus einem Zeiger auf die tatsächlichen Daten und einer Ganzzahl, die die Länge der Zeichenfolge darstellt.

Wenn Sie in eine Textdatei schreiben möchten, ist der beste Weg, dies zu tun, wahrscheinlich ofstreamein "Out-File-Stream". Es verhält sich genau so std::cout, aber die Ausgabe wird in eine Datei geschrieben.

Im folgenden Beispiel wird eine Zeichenfolge aus stdin gelesen und diese Zeichenfolge dann in die Datei geschrieben output.txt.

#include <fstream>
#include <string>
#include <iostream>

int main()
{
    std::string input;
    std::cin >> input;
    std::ofstream out("output.txt");
    out << input;
    out.close();
    return 0;
}

Beachten Sie, dass out.close()dies hier nicht unbedingt erforderlich ist: Der Dekonstruktor von ofstreamkann dies für uns erledigen, sobald outder Geltungsbereich überschritten wird .

Weitere Informationen finden Sie in der C ++ - Referenz: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Wenn Sie nun in binärer Form in eine Datei schreiben müssen, sollten Sie dies unter Verwendung der tatsächlichen Daten in der Zeichenfolge tun. Der einfachste Weg, diese Daten zu erfassen, wäre die Verwendung string::c_str(). Sie könnten also verwenden:

write.write( studentPassword.c_str(), sizeof(char)*studentPassword.size() );
JSQuareD
quelle
3
Ich musste std :: ios :: binary hinzufügen, um keine Probleme mit Zeilenumbrüchen zu haben
Waddles
19

Angenommen, Sie verwenden eine std::ofstreamzum Schreiben in eine Datei, dann schreibt das folgende Snippet eine std::stringDatei in lesbarer Form:

std::ofstream file("filename");
std::string my_string = "Hello text in file\n";
file << my_string;
stefan
quelle
0

Entfernen Sie die ios::binaryaus Ihren Modi in Ihrem Ofstream und verwenden Sie studentPassword.c_str()statt (char *)&studentPasswordin Ihremwrite.write()

Tolini
quelle