web-dev-qa-db-fra.com

Comment écrire std :: string dans un fichier?

Je veux écrire une variable std::string que l'utilisateur accepte dans un fichier. J'ai essayé d'utiliser la méthode write() et il écrit dans le fichier. Mais quand j'ouvre le fichier, je vois des cases à la place de la chaîne. 

La chaîne n'est qu'un seul mot de longueur variable. Est-ce que std::string convient à cela ou devrais-je utiliser un tableau de caractères ou quelque chose d'autre.

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

Vous écrivez actuellement les données binaires dans l'objet string- dans votre fichier. Ces données binaires ne seront probablement composées que d'un pointeur sur les données réelles et d'un entier représentant la longueur de la chaîne.

Si vous voulez écrire dans un fichier texte, le meilleur moyen de le faire serait probablement avec un ofstream, un "flux de fichier sortant". Il se comporte exactement comme std::cout, mais la sortie est écrite dans un fichier.

L'exemple suivant lit une chaîne de stdin, puis écrit cette chaîne dans le fichier 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;
}

Notez que out.close() n'est pas strictement nécessaire ici: le déconstructeur de ofstream peut gérer cela pour nous dès que out sort du cadre.

Pour plus d'informations, consultez la référence C++: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Maintenant, si vous avez besoin d'écrire dans un fichier sous forme binaire, vous devriez le faire en utilisant les données réelles de la chaîne. Le moyen le plus simple d’acquérir ces données serait d’utiliser string::c_str(). Pour que vous puissiez utiliser:

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

En supposant que vous utilisiez un std::ofstream pour écrire dans un fichier, l'extrait de code suivant écrira un std::string dans un fichier sous une forme lisible par l'homme:

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

Ce problème m'énervait et xxd ne fonctionnait pas pour mon cas d'utilisation, car la variable nommée __home_myname_build_prog_cmakelists_src_autogen avait été créée lorsque j'ai essayé de l'écrire dans un script. J'ai donc créé un utilitaire pour résoudre ce problème:

https://github.com/Exaeta/brcc

Il génère un fichier source et un fichier d’en-tête et vous permet de définir explicitement le nom de chaque variable afin que vous puissiez les utiliser via std :: begin (arrayname) et std :: end (arrayname).

Je l'ai incorporé à mon projet cmake comme suit:

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/binary_resources.hpp ${CMAKE_CURRENT_BINARY_DIR}/binary_resources.cpp
  COMMAND brcc ${CMAKE_CURRENT_BINARY_DIR}/binary_resources RGAME_BINARY_RESOURCES_HH txt_vertex_shader ${CMAKE_CURRENT_BINARY_DIR}/src/vertex_shader1.glsl
  DEPENDS src/vertex_shader1.glsl)

Avec de petites modifications, je suppose que cela pourrait fonctionner pour C aussi.

0
Exaeta

supprimez le ios::binary de vos modes dans votre ofstream et utilisez studentPassword.c_str() au lieu de (char *)&studentPassword dans votre write.write()

0
Tolini