Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile :
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.

Destroyers a écrit :

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 wink
je vais donc essayer d'apprendre cette bibliothèque aussi (complètement de préférence n'est ce pas smile) 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 roll
merci

Hors ligne

#14 Le 28/07/2011, à 20:05

Le Farfadet Spatial

Re : C++ ecrire dans des fichiers. [RESOLU]

Salut à tous !

Destroyers a écrit :

je t'écoute, apprend moi se que sont les Link roll

   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 smile
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 !

Destroyers a écrit :

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 smile

   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 smile
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