Lecture de fichier [C++] - C++ - Programmation
Marsh Posté le 04-09-2004 à 01:01:40
http://cplusplus.com/ref/iostream/
les bibliolinks bordel
Marsh Posté le 05-09-2004 à 13:07:16
j'ai un ti problème que je tente de comprendre
donc en gros, j'ai un fichier qui ressemble à ca
|
le peu de code que j'ai ressemble à ca
Code :
|
et le résultat c'est ca
[(0,2)(2,2)][(1,0)(1,3)]ÿ2 |
ya comme y2 en trop et j'ai aucune idée d'où ca sort
Marsh Posté le 05-09-2004 à 13:41:05
1) utilise le constructeur et laisse le destructeur fermer le fichier. si c'est un istream, le mode par défaut est in.
2) ton usage de eof est évidemment mauvais
Marsh Posté le 05-09-2004 à 14:38:34
ouin...
jcrois que jvais commencer par tenter de comprendre la différence entre ifstream, iostream et autres stream parce plusieurs me semble pratiquement identique
Marsh Posté le 05-09-2004 à 15:09:00
eof -> Check if End-Of-File has been reached.
good -> Check if stream is good for i/o operations. Notice that this function is not the exact opposite of bad()
Marsh Posté le 05-09-2004 à 15:10:54
'tain c'est pas compliqué.
char c;
while(cin.get(c)) blah;
Marsh Posté le 08-09-2004 à 03:00:05
si j'ai à lire un truc du genre
[(1.1,2.2)(2.1,3.4)]
bon je lis le caractère [ -> début d'un segment
le ( -> début des coordonnées d'un point
y'a moyen de récupéré directement le 1.1 dans un long ou bien je dois lire 1, ensuite ., ensuite 1, et en faire un double?
Marsh Posté le 08-09-2004 à 07:26:57
Il est 5h21 du matin, et Taz est sur la brèche. Jamais tu dors, toi ?
Marsh Posté le 08-09-2004 à 07:52:41
ben là j'ai une semaine de vacances supplémentaire, et je ne fais que travailler/coder depuis dimanche. J'en dors plus (bha ouais je fulmine, j'ai le sommeil léger, dès que j'ouvre l'oeil, je pense à un truc, et je vais le mettre en application. je me suis détester de devoir dormir la nuit de lundi à mardi tellement je voulais finir un truc)
Marsh Posté le 08-09-2004 à 11:36:35
Taz a écrit : comment tu veux mettre "1.1" dans un entier ? |
arf c'est moi qui dormait à moitié là, double, désolé
Marsh Posté le 10-09-2004 à 13:34:23
bon j'ai eu quelques minutes pour faire des test hier et j'ai finalement réussi à lire mes trucs, mais de manière plutot bourrin
je rappele un exemple de ligne:
[(1.1,2.2)(2.1,3.4)]
du genre:
tant que cin.get(c)
si c == '('
cin >> double1;
cin.get(c); // la virgule
cin >> double2;
...
jtrouve ca vraiment pas jolie, plutot bourrin et le problème que ca me cause est ce dernier:
si au lieu d'avoir une ligne toute bien formatté, j'ai plutot ce genre de truc:
[(1.1 ,2.2)(2.1,3.4)]
bin le cin entre le double1 et double2 fera pas ce que j'attends de lui (positionner le pointeur après la virgule)
alors jme dis que puisque moi même je trouve le code horrible et bourrin, et taz le trouvera surment 100 fois pire , qu'il doit bien avoir des notions qui permettent de lire dans un fichier selon certains pattern
sinon j'avais pensé lire le fichier en échappant les espaces et retour de ligne, faire une nouvelle stream et là faire mon traitement, mais encore là ya surement moyen de faire le tout dans 1 passe
Marsh Posté le 10-09-2004 à 13:43:49
<istream> -> ws(stream)
Marsh Posté le 10-09-2004 à 13:45:14
Masklinn a écrit : <istream> -> ws(stream) |
ca s'occupe aussi des retours de ligne?
selon ce que je suis en train de lire, jcrois pas
Marsh Posté le 10-09-2004 à 13:48:14
Tu fais souvent des retours à la ligne dans cin?
edit: ah oui a la base ca sort d'un fichier.
Ben non je pense pas, mais bon j'ai rarement besoin de ws
Marsh Posté le 10-09-2004 à 18:25:55
Masklinn a écrit : Tu fais souvent des retours à la ligne dans cin? |
ouais ca vient d'un fichier, et d'ailleurs ws semble pas marcher pour du ifstream
Marsh Posté le 10-09-2004 à 18:40:28
Code :
|
ca semble être ok pour les espaces et les retours de ligne
me reste plus qu'à replacer mon code pour récupéré les double
Marsh Posté le 10-09-2004 à 18:43:30
Sinon suffit de reprendre ton premier algo et de faire ton controle sur l'eof après la lecture et non avant et comme ca t'auras plus les trucs en trop à la fin
Marsh Posté le 10-09-2004 à 18:50:37
Jesus Army a écrit : Sinon suffit de reprendre ton premier algo et de faire ton controle sur l'eof après la lecture et non avant et comme ca t'auras plus les trucs en trop à la fin |
jpas sur de te suivre, là j'ai un truc fonctionnel, p-e pas le plus jolie mais c'est la première fois que je travaille avec des stream, alors si vous voyez un moyen de mettre ca moins bourrin
Code :
|
edit: quelques lignes du fichier pour vous montrer un peu
|
Marsh Posté le 10-09-2004 à 18:54:30
en quoi c'est bourrin ?
moi di j'étais toi, je lirais ligne par ligne, après je balancerais tout dans un istringstream, et apres je valide ligne par ligne
Marsh Posté le 10-09-2004 à 19:04:19
Taz a écrit : en quoi c'est bourrin ? |
c'est parce que les fichiers de test sont de plus en plus compliqué
ex: le premier, 2 lignes, aucun espace
le 2e, 100 lignes, des espaces
le 3e, plein de lignes, parfois des retours de lignes en plein milieu des coordonées d'un segment
donc le truc de lire une ligne à la fois je sais pas trop si ca le ferait (mais p-e que je me trompe)
pour le truc du bourrin, bin c'est p-e simplement parce que j'suis trop habitué de faire du perl depuis 1an et demi, et qu'un ligne comme ca:
iFile >> c >> c >> d1 >> c >> d2 >> c >> c >> d3 >> c >> d4 >> c >> c;
jtrouve pas ca nécessairement clair au premier regard, que j'aime pas trop devoir utilisé le c comme variable temporaire pour faire un discard des caractères que j'utilise pas
simple période d'adaptation surement
Marsh Posté le 13-09-2004 à 00:13:38
autre petite question
je ne connais pas le nombre de segment par fichier. Je dois les stocker dans un tableau pour ensuite faire un traitement (vérifier quels sont les segments qui se croisent)
vu que je ne connais pas le nombre de segment, je dois donc faire une première passe du fichier, déterminer le nombre de segment, pour ensuite faire une 2e passe, dans laquel pour chaque segment, je déclare mes 2 objets Point, ensuite je déclare mon objet Segment, que je place dans le tableau
ou y'a une manière de faire tout ca dynamique (avec les vector par exemple, que je n'ai jamais vu mais qui semble permettre ce genre de traitement)
Marsh Posté le 13-09-2004 à 01:30:07
si ça devient trop compliqué, utilise flex / expression régulière et on en parle plus
Marsh Posté le 13-09-2004 à 01:31:44
Taz a écrit : si ça devient trop compliqué, utilise flex / expression régulière et on en parle plus |
bah faut que ca reste en C++, c'est pour l'apprentissage quand même
Marsh Posté le 13-09-2004 à 01:46:10
bah lis ligne par ligne, après si t'es sur et certains de ton format, tu peux buter tout ce que tu veux, et après faire un simple
in >> a >> b >> c >> d
ou fais toi simplement une fonction next_number qui fait ce qu'il faut. c'est comme ça que je procède dans libgtop. un char[] et des fonctions de parcours
Marsh Posté le 13-09-2004 à 02:35:09
hum la récupération du data élément par élément c'est ok
c'est plutot pour placer le tout dans un tableau
ex: jai 20 segments, je fais un algo glouton pour tester si le 1er croise le 2e, le 3e, ..., le 20e
ensuite je passe au 2e et je le test avec le 3e, 4e, .. 20e
ainsi de suite
mais pour déclarer mon tableau de segment, j'ai besoin de connaitre le nombre de segment, alors:
a) je fais une passe qui compte le nombre de segment dans le fichier et une qui va déclarer mon tableau de segment et le remplir
b) j'utilise un truc que je connais pas qui me permettrait d'avoir un "tableau dynamique", ce qui selon ce que j'ai compris, un vector est en mesure d'effectuer
Marsh Posté le 13-09-2004 à 11:40:50
Taz a écrit : vector/queue c'est très bien |
dac c'est un peu ce que je voulais entendre
jvais regarder un peu comment ca fonctionne alors
Marsh Posté le 14-09-2004 à 14:25:50
bon j'ai appris comment faire pour que l'objet soi capable de se lire lui même mais ca ne semble pas fonctionner
Code :
|
Code :
|
mon utilisation
Code :
|
Le résultat
|
pourtant j'avais cru comprendre que le ifstream, s'il trouvait pas dans sa lib comment lire l'objet Segment ou Point, qu'il regarderait pour un prototype dans mon code, hors ca semble pas le cas
Marsh Posté le 14-09-2004 à 16:21:41
J'ai la flemme de t'expliquer pourquoi (un autre le fera...).
Mais remplace tes ifstream par des istream.
Edit: Pas dans la déclaration du fichier, bien sûr. Fais le juste au niveau de la déclaration de tes opérateurs surchargés.
Marsh Posté le 15-09-2004 à 00:01:31
Lam's a écrit : J'ai la flemme de t'expliquer pourquoi (un autre le fera...). |
ok
maintenant quelqu'un qui m'explique le pourquoi?
Marsh Posté le 15-09-2004 à 15:03:59
Burgergold a écrit : ok |
Tu as essayé de demander à Bjarne Stroustrup ? aux Deitel ? Herb Sutter ? Scott Meyers ?
Sinon,
Code :
|
Dès que tu as transféré ton flux vers ta chaîne s, le type du flux en cours est "perdu" : ce n'est plus un ifstream, mais juste un istream (sa classe de base).
Il faut donc que tu sois capable de travailler sur un istream, sinon le compilateur ne saura pas comment effectuer l'opération:
Code :
|
Marsh Posté le 15-09-2004 à 15:07:50
Lam's a écrit : Tu as essayé de demander à Bjarne Stroustrup ? aux Deitel ? Herb Sutter ? Scott Meyers ?
|
bin à vrai dire la dernière fois qu'on s'est parlé ca s'est mal fini, alors j'préfère les éviter (à vrai dire, jai aucune idée de qui tu parles )
mais merci pour l'explication
Marsh Posté le 17-09-2004 à 04:49:42
si dans le fichier, je veux dabord compter le nombre de segment, ensuite me déclarer un tableau, et relire ce fichier pour remplir le tableau, jsuis obligé de faire 2 accès au fichier où ya moyen de copier mon ifstream dans une autre stream réutilisable pour ma 2e boucle? (en espérant que ca soit un peu plus rapide)
Marsh Posté le 17-09-2004 à 08:15:23
Burgergold a écrit : bin à vrai dire la dernière fois qu'on s'est parlé ca s'est mal fini, alors j'préfère les éviter (à vrai dire, jai aucune idée de qui tu parles ) |
Des grands gourous du C++.
Stroustrup : créateur du langage.
Herb Sutter : http://www.gotw.ca/gotw/
Scott Meyers : "Effective C++", "More Effective C++"
Pour ta question, je ne sais pas. Moi, j'essaierais de copier le stream directement dans une structure que j'agrandis au fur et à mesure (donc pas un vector si possible) par a coups (de 10 ou 100 ko) -> pas de 2e passe.
Marsh Posté le 04-09-2004 à 00:57:20
Bon voila, jviens de me remettre aux études. J'ai pratiquement pas touché au C depuis 3 ans et me voilà à mon premier TP.
Lorsque j'ai appris le C, je faisais la lecture de fichier avec fopen, fread, fclose. Mais si je me trompe pas, ca c'est du C.
Désirant m'approcher le plus possible du concept du C++, je dois utiliser cin ou bien le fopen, fread, fclose est tout de même approprié en C++?
merci à Taz à l'avance