Bonjour!
J ai un fichier texte, et je voudrai pouvoir lire la première ligne, et la stocker dans une variable, puis ensuite lire la seconde, la stocker dans une aitre variable,etc..quelq'un peut-il m aider?
Version imprimable
Bonjour!
J ai un fichier texte, et je voudrai pouvoir lire la première ligne, et la stocker dans une variable, puis ensuite lire la seconde, la stocker dans une aitre variable,etc..quelq'un peut-il m aider?
le C++ ne connait pas la notion de lignes...Citation:
Envoyé par rodgeurette
par contre, si tu veux parler de ce qui est contenu entre deux '\n', la on peut se comprendre.
as tu regardé la doc de la classe std::ifstream, et particulierement de sa fonction getline() ?
Tout ça est expliqué dans la FAQ.
C'est quand même assez contradictoire de dire ça, puis de conseiller d'utiliser une fonction qui s'appelle getline ;)Citation:
le C++ ne connait pas la notion de lignes...
sauf que getline() prend un parametre par défaut (de valeur '\n') mais qui peut etre changéCitation:
Envoyé par Laurent Gomila
Donc c'est encore mieux que de pouvoir lire que "ligne par ligne" car on peut lire des blocs de caractères séparés par un séparateur précis.
Tu y vois un problème ? Faut le vouloir :aie:
Du moment où l'on parle de \n, on parle de lignes de toute manière ...
ça peut t'aider :
Exemple : Read and display a text file line by line.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { if(argc != 2) { cout << "Usage: Display <filename>\n"; return 1; } ifstream in(argv[ 1 ]); // input if(!in) { cout << "Cannot open input file.\n"; return 1; } char str[ 255 ]; while(in) { in.getline(str, 255); // delim defaults to '\n' if(in) cout << str << endl; } in.close(); return 0; }
Très bon exemple de comment il ne pas faire, Sceener ;). Pour la solution correcte, voir la FAQ.
Salut,
@ Screener==>
De manière à ce que tu puisse corriger tes erreurs, voici quelques explications qui te permettront de les comprendre:
Ton code
sous-entend que, au pire, ta ligne fera 254 caracteres (vu qu'il faut le '\0' pour la terminer)Code:char str[255];
Or, il n'y a strictement rien qui empeche d'avoir un fichier texte dont la ligne prend (tres) largement plus que 254 caracteres avant le retour à la ligne :P
Le problème, c'est que, meme si tu décidait de mettre 65535, voire, pourquoi pas, un nombre encore plus élevé, tu ne serait toujours pas sur de prévoir une place suffisante, et, d'aucun s'écriraient à ce moment là que, de plus, tu va monopoliser inutilement, pour une seule variable, un espace mémoire qui pourrait etre tellement utile pour autre chose.
La SL fournit une classe réellement géniale pour gérer les chaines de caracteres, et qui prend tous les cas en compte: la std::string (voir, si tu travailles en UTF, une spécialisation de celle-ci avec les wchar_t)
Le code
pose une série de problèmes, ainsi d'ailleurs que l'utilisation deCode:while(in)
On préféreras bien souvent utiliser tout simplement une boucle du genre deCode:in.getline()
(voir la FAQ sur le sujet)Code:while(getline,fichier, string)
Pour t'en convaincre, je voudrais simplement que tu prenne la peine d'essayer de lire le fichier joint avec le code, dérivé du tien que voici:
Enfin, le codeCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 int main() { std::ifstream iss("essai.txt"); char str[255]; while(iss) { iss.getline(str,255); std::cout<<str<<std::endl<<std::endl; } if(!iss.eof()) { std::cout<<"COUAC... ou est le reste du fichier???"; } return 0; }
est ici inutile: la variable étant détruite deux instructions plus tard (quand la fonction est quittée;) ) le fichier sera automatiquement fermé ;)Code:in.close()