Come scrivere std :: string su file?


89

Voglio scrivere una std::stringvariabile che accetto dall'utente in un file. Ho provato a utilizzare il write()metodo e scrive sul file. Ma quando apro il file vedo delle caselle invece della stringa.

La stringa è solo una singola parola di lunghezza variabile. È std::stringadatto a questo o dovrei usare un array di caratteri o qualcosa del genere.

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();`
}

3
Per favore mostra il tuo codice. In generale, se usato correttamente, std::stringva bene per questo.
Inutile

2
È necessario salvare il CONTENUTO "payload" della stringa, non l'oggetto stringa in quanto tale (che in genere contiene solo una lunghezza e un puntatore al contenuto effettivo)
Mats Petersson

Risposte:


124

Stai attualmente scrivendo i dati binari stringnell'oggetto nel tuo file. Questi dati binari saranno probabilmente costituiti solo da un puntatore ai dati effettivi e da un numero intero che rappresenta la lunghezza della stringa.

Se vuoi scrivere su un file di testo, il modo migliore per farlo sarebbe probabilmente con ofstreamun "out-file-stream". Si comporta esattamente come std::cout, ma l'output viene scritto su un file.

L'esempio seguente legge una stringa da stdin e quindi scrive questa stringa nel file 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;
}

Nota che out.close()non è strettamente necessario qui: il decostruttore di ofstreampuò gestirlo per noi non appena outesce dal campo di applicazione.

Per ulteriori informazioni, vedere il riferimento C ++: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Ora, se hai bisogno di scrivere su un file in forma binaria, dovresti farlo usando i dati effettivi nella stringa. Il modo più semplice per acquisire questi dati sarebbe utilizzare string::c_str(). Quindi potresti usare:

write.write( studentPassword.c_str(), sizeof(char)*studentPassword.size() );

4
Ho dovuto aggiungere std :: ios :: binary per non avere problemi con i caratteri di nuova riga
Waddles

21

Supponendo che tu stia usando a std::ofstreamper scrivere su file, il seguente frammento scriverà un std::stringfile in formato leggibile dall'uomo:

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

0

rimuovi il ios::binarydai tuoi modi nel tuo ofstream e usa studentPassword.c_str()invece che (char *)&studentPasswordnel tuowrite.write()

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.