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();`
}
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() );
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;
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.
supprimez le ios::binary
de vos modes dans votre ofstream et utilisez studentPassword.c_str()
au lieu de (char *)&studentPassword
dans votre write.write()