Slt,
est-ce que qq1 a un exemple de code ou l'on ouvre un fichier .txt dans lequel on a des valeurs, ensuite on le lit, puis on charge ces valeurs dans un vector<>?
Slt,
est-ce que qq1 a un exemple de code ou l'on ouvre un fichier .txt dans lequel on a des valeurs, ensuite on le lit, puis on charge ces valeurs dans un vector<>?
Avec les stream_iterator c'est très simple, tu peux charger les valeurs directement dans le vecteur. Par exemple pour des int :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <fstream> #include <vector> #include <iterator> #include <iostream> int main() { std::ifstream fichier("mon_fichier.txt"); std::vector<int> valeurs( (std::istream_iterator<int>(fichier)), std::istream_iterator<int>()); if (!fichier.eof()) std::cerr << "Erreur de lecture !\n"; }
Salut a tous, j'ai une question concernant ces commandes a laquelle je ne trouve pas de réponse. Je veux également lire un fichier txt, mais le fichier a ouvrir n'est pas connu a la compilation, et je veux laisser l'utilisateur rechercher sur le disque le fichier, de la même manière que lorsque l'on clique sur le bouton "ouvrir" dans la plupart des programme...
Une idée ?
Salut,
C'est *relativement* simple:
1- tu récupère le nom du fichier à ouvrir dans une chaine de caractères (std::string, par exemple, c'est l'idéal)
2- tu transmet cette chaine en veillant à la passer sous la forme d'une chaine "C style" (c'est une vieille restriction des *fstream) au constructeur, en lieu et place de "fichier.txt".
Cela te donne, par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main() { std::string str; /* récupération du nom de fichier dans str... à toi de voir comment * faire selon la bibliothèque IHM que tu utilise :D */ std::ifstream fichier(str.c_str()); std::vector<int> valeurs( (std::istream_iterator<int>(fichier)), std::istream_iterator<int>()); if (!fichier.eof()) std::cerr << "Erreur de lecture !\n"; }
hum encore une question qui va pas être très dur a solutionner je pense, enfin je l'espère en tout cas ^^
j'ai écrit dans mon code :
std::ofstream fichier("C:\test.txt", ios::app);
fichier>>"n importe quoi";
mais rien ne se passe, le fichier n'est même pas créé.
Si je créé un fichier nomé test.txt au bon emplacement, rien ne s'écrit dessus, même quand celui ci est fermer. Qu'ai-je fait de mal ?
Ton ne devrait même pas compiler (En tout cas, ceci ne compile pas chez moi)
>> est pour lire depuis un flux, << est pour écrire dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <fstream> int main(int argc, char const *argv[]) { std::ofstream fichier("test.txt", std::ios::app); fichier>>"n importe quoi"; return 0; }
Il faut donc faire
La prochaine fois, essaye de chercher un peu par toi même, c'est une erreur très basique tu aurais sans doute pu trouver la réponse dans une cours sur les flux du C++.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <fstream> int main(int argc, char const *argv[]) { std::ofstream fichier("test.txt", std::ios::app); fichier<<"n importe quoi"; return 0; }
Il faut savoir que l'anti slash (ou back slash) "\" est connu comme caractère d'échappement.
C'est pour cela que '\0', '\n','\t" et tant d'autres sont considérés comme des caractères uniques.
Lorsque tu écrit "c:\text.txt", "\t" est donc considéré comme... un caractère unique qui, en l'occurrence, correspond à la tabulation.
Si tu veux utiliser l'anti slash en tant que tel, tu dois... l'échapper, ce qui donne "c:\\text.txt"![]()
c'etait une erreur de retranscription, j'avais bien entendu fait :
std::ofstream fichier("C:\test.txt", ios::app);
fichier<<"n importe quoi";
mettre std::ios::app ne change rien a mon histoire...heum ça devient louche.
Peut être un fichier.open(); serait-il le bienvenu? Et aussi un fichier.close(); à la fin? Essaie ...
Malheureux... surtout pas...
Je m'explique:
Il existe un principe que l'on appelle RAII (Ressource Acquisition Is Initialization), qui conseille de tout faire en de manière à obtenir des objets totalement initialisés au moment où on les crées.
L'effet inverse, c'est que la destruction d'un objet provoque la libération des ressources.
Pour les fichiers, il existe (c'est fait pour) un constructeur qui prend un nom de fichier et éventuellement des flags de positionnement, qui fait que le fichier est bel et bien ouvert lorsque l'objet est créé.
Inversement, le destructeur des classes *fstream provoque... la fermeture du fichier.
L'objet étant détruit dés que l'on quitte la portée dans laquelle il est déclaré, le fichier sera donc bel et bien fermé
Il n'y a donc aucune raison pour inciter les gens à utiliser open et close lorsque ce n'est pas utile, car cela revient à se faire du mal pour rien, en plus d'inciter à risquer des problèmes (que se passerait-il si on essayait d'ouvrir un fichier... déjà ouvert)
Le seul cas dans lequel il peut effectivement être utile d'envisager le recours à open et à close, c'est si tu envisage la création d'une classe dont un des membres est un *fstream, et que tu souhaite pouvoir décider du nom du fichier à ouvrir "à la volée"![]()
D'accord, je vais donc supprimer ces fonctions de mes programmes.
Je n'irai pas jusqu'à dire qu'il faut reprendre l'ensemble des programmes que tu as pu créer ces dix dernières années pour supprimer le travail en deux temps que tu t'es imposé juqu'à présent, loin de là, mais il est sans doute opportun d'en tenir compte pour la suite
Chaque fois que tu fais un
ou un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ifstream ifs; ifs.open("fichier.txt"); /*...*/ ifs.close();
tu peux estimer qu'un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ofstream ofs; ofs.open("fichier.txt"); /*...*/ ofs.close();
simple
aurait largement suffit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ifstream ifs("fichier.txt"); /* respectivement */ ofstream ofs("fichier.txt");![]()
Oui effectivement, c'est surtout de ne pas avoir fait passer le nom du fichier dans le constructeur qui m'oblige à appeller la fonction open();
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager