Como escrever std :: string no arquivo?

86

Quero escrever uma std::stringvariável que estou aceitando do usuário para um arquivo. Tentei usar o write()método e ele grava no arquivo. Mas, quando abro o arquivo, vejo caixas em vez da string.

A string é apenas uma única palavra de comprimento variável. É std::stringadequado para isso ou devo usar uma matriz de caracteres ou algo assim.

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
fonte
3
Por favor, mostre seu código. Em geral, se usado corretamente, std::stringestá bom para isso.
Inútil
2
Você precisa salvar o CONTENT da 'carga' da string, não o objeto da string como tal (que normalmente contém apenas um comprimento e um ponteiro para o conteúdo real)
Mats Petersson

Respostas:

120

No momento, você está gravando os dados binários no stringobjeto -no seu arquivo. Esses dados binários provavelmente consistirão apenas em um ponteiro para os dados reais e um inteiro representando o comprimento da string.

Se você deseja gravar em um arquivo de texto, a melhor maneira de fazer isso provavelmente seria com ofstreamum "fluxo de saída do arquivo". Ele se comporta exatamente como std::cout, mas a saída é gravada em um arquivo.

O exemplo a seguir lê uma string de stdin e, em seguida, grava essa string no arquivo 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;
}

Observe que out.close()não é estritamente necessário aqui: o desconstrutor de ofstreampode cuidar disso para nós assim que outsair do escopo.

Para obter mais informações, consulte C ++ - referência: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Agora, se você precisar gravar em um arquivo no formato binário, deverá fazer isso usando os dados reais da string. A maneira mais fácil de adquirir esses dados seria usando string::c_str(). Então você pode usar:

write.write( studentPassword.c_str(), sizeof(char)*studentPassword.size() );
JSQuareD
fonte
3
Tive que adicionar std :: ios :: binary para que isso não tivesse problemas com caracteres de nova linha
Waddles
19

Supondo que você esteja usando um std::ofstreampara gravar no arquivo, o seguinte snippet gravará um std::stringno arquivo em formato legível por humanos:

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

remova o ios::binaryde seus modos em seu ofstream e use em studentPassword.c_str()vez de (char *)&studentPasswordem seuwrite.write()

Tolini
fonte