#1 Le 23/07/2011, à 16:17
- Destroyers
C++ ecrire dans des fichiers. [RESOLU]
Bonjour à tous
mon problème n'est pas très compliqué.
Pour définir la racine ou sera le fichier, on l'écrit comme suit:
std::ofstream monflux ("/home/destroyers/programmes/fichier.txt")
seulement voilà, comment faire pour que l'utilisateur entre lui même là ou il veut enregistrer le fichier ?
j'ai essayé en mettant un std::string mais sa marche pas.
ensuite, comment faire pour que l'utilisateur choisisse le nom du fichier ?
et dernière question, comment faire pour que le programme change le nom du fichier automatiquement si il y en a déjà un qui existe ?(pour créer un nouveau fichier)
Merci.
Dernière modification par Destroyers (Le 30/07/2011, à 10:52)
Hors ligne
#2 Le 23/07/2011, à 20:38
- Teofifil
Re : C++ ecrire dans des fichiers. [RESOLU]
Bonjour,
Un moyen est d'utiliser une fenêtre de dialogue. Si tu utilise QT comme bibliothèque d'objet tu trouveras ton bonheur ici : QDialogFile.
Tu devrais trouver ton bonheur ailleurs.
Hors ligne
#3 Le 23/07/2011, à 22:07
- Ylfang
Re : C++ ecrire dans des fichiers. [RESOLU]
bonjour,
tu peux essayer d'utiliser .c_str() une fonction membre de std::string qui va te donner un pointeur sur ton tableau de caractère
std::string fichier = "/home/destroyers/programmes/fichier.txt";
std::ofstream monflux(fichier.c_str());
Je n'ai pas vérifier que cela marchais
Hors ligne
#4 Le 23/07/2011, à 23:03
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
Non là je ne veux que la bibliothèque standard.
Merci Ylfang je ne connaissais pas cette fonction membre (en faite j'en connais assez peu...)
sa marche.
maintenant il reste les 2 autres questions :
comment faire pour que l'utilisateur choisisse le nom du fichier ?
comment faire pour que le programme change le nom du fichier automatiquement si il y en a déjà un qui existe ?(pour créer un nouveau fichier)
Hors ligne
#5 Le 23/07/2011, à 23:52
- Ylfang
Re : C++ ecrire dans des fichiers. [RESOLU]
Qu'est cela signifie que l'utilisateur choisisse le nom du fichier ? Est-ce que ton programme doit pouvoir changer le nom d'un fichier ouvert où pouvoir faire une recherche parmis les fichiers existants ?
Pour créer un fichier :
std::ofstream flux;
flux.open("monfichier.txt", ios::out) //ouvre un fichier en écriture
if(flux.bad())
std::cout << " Erreur dans l'ouverture du fichier" ;
//operations sur ton fichier
flux.close();
Je pense que si le fichier n'existe pas il sera créer et tu pourra le manipuler tout de suite après..
Hors ligne
#6 Le 24/07/2011, à 00:05
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
ba... Comment l'utilisateur pourrait nommer lui même son fichier sans avoir à mettre tout le chemin (chemin qui serait déjà défini parle programme)?
je reformule la 2e question:
imaginons:
void test()
{
ofstream ecrire ("chemin/fichier.txt");
}
on lance la fonction test: le fichier "fichier.txt" est créé.
maintenant on relance la fonction test pour créer un 2e fichier...or c'est impossible car ils auront le même nom.
donc comment faire pour que le programme change lui même automatiquement le nom du nouveau fichier ?
je ne vous parle pas ici de la génération d'un nom, mais de faire en sorte de placer ce nom dans le chemin automatiquement ...
ofstream ecrire ("chemin/fichier2.txt")
Dernière modification par Destroyers (Le 24/07/2011, à 00:06)
Hors ligne
#7 Le 24/07/2011, à 10:31
- omc
Re : C++ ecrire dans des fichiers. [RESOLU]
Bonjour,
Je sais que tu ne veux utiliser que la STL (Standart Template Library), mais là boost::path est vraiment ton ami.
http://matthieu-brucher.developpez.com/ … ilesystem/
Hors ligne
#8 Le 24/07/2011, à 12:25
- Ylfang
Re : C++ ecrire dans des fichiers. [RESOLU]
je suis d'accord avec omc boost te simplifierais la vie.
Sinon renseignes toi plus sur fstream :
http://www.cplusplus.com/reference/iostream/fstream/
http://www.cplusplus.com/doc/tutorial/files/
Hors ligne
#9 Le 24/07/2011, à 14:42
- Le Farfadet Spatial
Re : C++ ecrire dans des fichiers. [RESOLU]
Salut à tous !
Bon, je propose une petite synthèse.
seulement voilà, comment faire pour que l'utilisateur entre lui même là ou il veut enregistrer le fichier ?
j'ai essayé en mettant un std::string mais sa marche pas.
Les chaînes de caractères en C++ sont gérées avec « std::string », tu as donc raison de l’utiliser. Cependant, pour des raisons de compatibilité, « std::fstream » n’attend pas une chaîne de caractères C++, mais une chaîne de caractères C. La classe « std::string » possède la fonction membre « c_str() » qui renvoie une chaîne de caractères C – constante, donc non modifiable – correspondant à la chaîne de caractère C++.
Il existe d’autres cas où il faut transmettre une chaîne de caractères C, cas pour lesquels la fonction « c_str() » a été créée.
comment faire pour que le programme change le nom du fichier automatiquement si il y en a déjà un qui existe ?(pour créer un nouveau fichier)
Il est impossible de savoir dans l’absolu par quoi remplacer un nom de fichier s’il existe déjà, ni non plus si c’est une idée qui n’est pas dangereuse. Il faudra donc que tu codes toi-même ce qu’il faut pour cela. Le moyen de le faire de manière efficace et portable, c’est d’utiliser « Boost::filesystem ». Une fois de plus, comme il a été indiqué, Developpez.com propose une bonne base pour découvrir « Boost::filesystem ».
Encore une fois, Boost peut être considérée comme une extension de la bibliothèque standard, elle est à peu prêt incontournable pour le développeur C++.
À bientôt.
Le Farfadet Spatial
Hors ligne
#10 Le 24/07/2011, à 19:31
- Karl_le_rouge
Re : C++ ecrire dans des fichiers. [RESOLU]
Je noterais juste que si on utilise Boost::filesystem, il faut faire attention à utiliser la version 3 de l'API disponible depuis la version 1.44 (par défaut, à partir de la 1.46, avant il faut définir la macro BOOST_FILESYSTEM_VERSION à 3), la version 2 de l'API présentée dans l'article sera définitievement supprimée à la prochaine version (1.48). D'ailleurs, la gestion des chemins a pas mal changée entre les deux versions, elle gagne une meilleur support de l'i18n, une gestion plus rationnelle des chemins entre autres
Hors ligne
#11 Le 24/07/2011, à 22:41
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
Ok merci tout le monde, je vois que je ne peux pas couper à Boost
je vais donc essayer d'apprendre cette bibliothèque aussi (complètement de préférence n'est ce pas ) avant de me mettre a la SFML.
il faut télécharger/installer quelque chose pour utiliser boost ? ?
Hors ligne
#12 Le 25/07/2011, à 07:40
- omc
Re : C++ ecrire dans des fichiers. [RESOLU]
Salut,
Oui tu dois installer la bibliothèque, si tu es sous Ubuntu/Debian/..., c'est le paquet "libboost-all-dev".
Il faut comprendre que, en fait, boost n'est une bibliothèque mais une collection de bibliothèques.
Certaines d'entre-elles requiert que tu te links et d'autres non (c'est dans les docs).
Par exemple boost::filesystem requiert que tu te links à "libboost_filesystem.so" (ou "libboost_filesystem.a" pour du link statique).
Ce fichier ce trouve généralement dans /usr/lib.
J'espère que tu connais la signification de "link" ou "édition des liens" car sinon tout ce que je viens de dire sera un peu abstrait.
Mais de toute façon ces notions sont indispensables pour comprendre ce qu'est un programme...
Hors ligne
#13 Le 28/07/2011, à 19:53
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
je t'écoute, apprend moi se que sont les Link
merci
Hors ligne
#14 Le 28/07/2011, à 20:05
- Le Farfadet Spatial
Re : C++ ecrire dans des fichiers. [RESOLU]
Salut à tous !
je t'écoute, apprend moi se que sont les Link
La compilation créée différentes unités de compilations, qui se concrétisent en fichier objets (.o). En gros, il y en a une par fichier .cpp, plus une par bibliothèque. Ensuite, il faut lier ces différentes unités, afin de composer un programme cohérent : c’est la phase d’édition de lien. Les bibliothèques peuvent être liées statiquement ou dynamiquement, mais je n’entre pas dans ce détail pour l’instant.
Pour utiliser une bibliothèque, il faut indiquer au compilateur où se trouvent les fichiers d’en-têtes et les fichiers objets.
Pour savoir comment le faire concrètement, cela dépend de ce que tu utilises. Si tu utilises Code:Block, je ne fais pas de support : soit quelqu’un d’autre t’explique comment faire, soit tu cherches sur Internet. Si tu utilises une méthode de construction standard, alors je peux sans doute t’expliquer comment faire.
À bientôt.
Le Farfadet Spatial
Hors ligne
#15 Le 28/07/2011, à 20:16
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
Salut,
il n'y a pourtant rien à indiquer au compilateur pour le la bibliothèque standard ...
un moment, tu m'as déconseillé d'utiliser un IDE, je vais donc pas tarder a utiliser le terminal
donc je veux bien que tu me dise comment indiquer ou sont les fichiers d'en-tête,
profite en pour me donner les lignes de commendes nécessaires pour compiler via le terminal, et me dire si ce compilateur est fourni avec Ubuntu ou si il faut le télécharger, s'il te plait.
merci
Hors ligne
#16 Le 28/07/2011, à 21:02
- Le Farfadet Spatial
Re : C++ ecrire dans des fichiers. [RESOLU]
Salut à tous !
il n'y a pourtant rien à indiquer au compilateur pour le la bibliothèque standard ...
La bibliothèque standard faisant partie du langage, il n’y a rien à ajouter.
un moment, tu m'as déconseillé d'utiliser un IDE, je vais donc pas tarder a utiliser le terminal
Pas du tout. Lorsque je donne des cours de C++ à des débutants, je conseille d’utiliser l’environnement de développements KDevelop. Moi-même, j’utilise un environnement de développements orienté texte, à savoir GNU Emacs. Je déconseille Code:Block, mais Code:Block n’est le seul environnement de développement, loin s’en faut. Après, je le déconseille, mais tu fais ce que tu veux.
Il a été récemment question des environnements de développements sur le forum.
donc je veux bien que tu me dise comment indiquer ou sont les fichiers d'en-tête,
Au moment de la compilation, il faut indiquer dans quel répertoire se trouve les fichiers d’en-tête, avec Gcc cela se fait à l’aide de l’option « -I ». Au moment de l’édition des liens, il faut indiquer dans quel répertoire se trouve les fichiers objets, avec Gcc cela se fait à l’aide de l’option « -L ». Cela dit, si l’installation de Boost est standard, par exemple si tu l’as installé à partir des dépôts d’Ubuntu, les en-têtes sont situés dans le répertoire standard « /usr/include/boost/ » et les binaires dans le répertoire standard « /usr/lib/ », il n’est donc pas nécessaire de les préciser.
En revanche, il faut indiquer à l’édition des liens le nom de la bibliothèque que l’on souhaite utiliser avec l’option « -l ». Dans le cas de Boost:Filesystem, cela donne « -lboost_filesystem ».
profite en pour me donner les lignes de commendes nécessaires pour compiler via le terminal, et me dire si ce compilateur est fourni avec Ubuntu ou si il faut le télécharger, s'il te plait.
Usuellement, on utilise le compilateur Gcc (tu peux en utiliser un autre). Au moins sous GNU/Linux, Code:Block utilise Gcc, donc tu l’as déjà installé.
Pour effectuer la compilation, on utilise l’option « -c » :
$ g++ -c nom_fichier.cpp
Ceci va produire le fichier « nom_fichier.o ».
Pour réaliser l’édition des liens, on indique le nom du fichier résultant à l’aide de l’option « -o » :
$ g++ -lboost_filesystem nom_fichier.o -o nom_executable
Pour exécuter le programme :
$ ./nom_executable
Tu peux réaliser la compilation et l’édition de lien en une seule commande :
$ g++ -lboost_filesystem nom_fichier.cpp -o nom_executable
Je te conseille de faire un petit peu de compilation dans le terminal, puis de te pencher sur un système de compilation. À mon avis, aujourd’hui il y en a deux qui valent le détour : Scons et CMake. Pour ma part, j’utilise CMake.
Link31 a fait un épinglé concernant la compilation.
À bientôt.
Le Farfadet Spatial
Hors ligne
#17 Le 28/07/2011, à 21:47
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
Merci.
selon ton lien, tu conseilles eclipse entre autres.
je vais utiliser cet IDE (car je l'ai déjà utilisé quand je programmais en java) oui je sais c'est pas le même eclipse
Merci et à bientôt.
Hors ligne
#18 Le 30/07/2011, à 10:45
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
le problème est que quand je copie colle le contenu de mes fichiers de code bloc dans ceux d'éclipse , le programme ne se compile pas, avec 91 erreurs ! pourtant le code n'a pas changé ...
exemple:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
Invalid arguments '
Candidates are:
std::basic_istream<char,std::char_traits<char>> & ignore()
std::basic_istream<char,std::char_traits<char>> & ignore(int)
std::basic_istream<char,std::char_traits<char>> & ignore(int, int)
'
Symbol 'numeric_limits' could not be resolved
Function 'max' could not be resolved
ensuite quasiment aucun de mes "std::cout" n'est reconnu.
Symbol 'cout' could not be resolved
et il semble qu'éclipse ne fais pas le lien entre les fichiers .h et .cpp
Member declaration not found
c'est comme sa pour toutes mes méthodes.
et il y a encore de multiples erreurs...
j'aimerais savoir si j'ai oublié quelque chose, ou si je doit totalement réapprendre a programmer sous prétexte que j'ai changé d'IDE
car je rappelle que ce code est exactement le même que celui que j'ai écrit sous code bloc, avec lequel mon code fonctionne très bien.
Merci
Dernière modification par Destroyers (Le 30/07/2011, à 10:47)
Hors ligne
#19 Le 30/07/2011, à 10:52
- Destroyers
Re : C++ ecrire dans des fichiers. [RESOLU]
je suis désolé du dérangement car au bout de quelque compilations, le compilateur ne me hurlait plus dessus -_-
j'ai pas compris pourquoi maintenant sa marche alors que j'ai rien changé ...
mais je vais pas chercher a comprendre
Merci
Hors ligne