¿Cómo escribir std :: string en un archivo?

86

Quiero escribir una std::stringvariable que estoy aceptando del usuario en un archivo. Intenté usar el write()método y escribe en el archivo. Pero cuando abro el archivo, veo cuadros en lugar de la cadena.

La cadena es solo una palabra única de longitud variable. Es std::stringadecuado para esto o debería usar una matriz de caracteres o algo así.

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
fuente
3
Muestra tu código. En general, si se usa correctamente, std::stringestá bien para esto.
Inútil
2
Debe guardar el CONTENIDO de la 'carga útil' de la cadena, no el objeto de cadena como tal (que generalmente contiene solo una longitud y un puntero al contenido real)
Mats Petersson

Respuestas:

120

Actualmente está escribiendo los datos binarios en el objeto string-a su archivo. Estos datos binarios probablemente solo consistirán en un puntero a los datos reales y un número entero que representa la longitud de la cadena.

Si desea escribir en un archivo de texto, la mejor manera de hacerlo probablemente sería con ofstreamun "flujo de salida de archivo". Se comporta exactamente igual std::cout, pero la salida se escribe en un archivo.

El siguiente ejemplo lee una cadena de stdin y luego escribe esta cadena en el archivo 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;
}

Tenga en cuenta que out.close()no es estrictamente necesario aquí: el deconstructor de ofstreampuede manejar esto por nosotros tan pronto como outsalga del alcance.

Para obtener más información, consulte la referencia de C ++: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Ahora, si necesita escribir en un archivo en forma binaria, debe hacerlo utilizando los datos reales en la cadena. La forma más sencilla de adquirir estos datos sería mediante string::c_str(). Entonces podrías usar:

write.write( studentPassword.c_str(), sizeof(char)*studentPassword.size() );
JSQuareD
fuente
3
Tuve que agregar std :: ios :: binary para que esto no tuviera problemas con los caracteres de nueva línea
Waddles
19

Suponiendo que está utilizando un std::ofstreamarchivo para escribir en el archivo, el siguiente fragmento escribirá un std::stringarchivo en un formato legible por humanos:

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

elimine el ios::binaryde sus modos en su ofstream y úselo en studentPassword.c_str()lugar de (char *)&studentPassworden suwrite.write()

Tolini
fuente