condition de sortie d'une boucle while = retour chariot [Résolu][C] - C - Programmation
Marsh Posté le 16-07-2008 à 17:02:56
Tu ne testes pas le cas où tu atteindrais la fin de fichier ? 13, ca ressemble à un nombre magique, il s'avère que c'est un '\r' et non pas un '\n' ... donc compare à '\n', ce sera plus lisible !
Marsh Posté le 16-07-2008 à 18:39:33
et pourquoi lire caractére par caractère alors que getline marche très bien :[
Marsh Posté le 16-07-2008 à 20:30:38
Parce qu'on est en C et que getline c'est du C++
Par contre on peut utiliser fgets() qui, effectivement, fait ça très bien.
Marsh Posté le 16-07-2008 à 20:56:29
le probleme c'est que fgets s'arrete à l'espace.
Le fichier que je li et de la forme
23/01/2333 blablabla 12 14
blibliblibli fjrfhr rfiojr
24/01/2333 blablabla 12 14
blibliblibli fjrfhr rfiojr
Marsh Posté le 16-07-2008 à 21:35:02
fatloui a écrit : le probleme c'est que fgets s'arrete à l'espace. |
Nope. La fonction fgets() s'arrête soit à la fin d'une ligne, soit lorsque le buffer que tu lui as donné est plein. Si la fonction s'arrête "à un espace" c'est que le buffer que tu lui as donné est plein à ce moment-là.
http://www.manpagez.com/man/3/fgets/
Marsh Posté le 16-07-2008 à 22:09:07
Je vois pas comment utiliser le fgets sans avoir le nombre de caracteres à lire.
mais j'ai tester avec le /n au lieu du /r car c'etait effectivement juste un retour à la ligne et non pas un retour chariot
(je savais pas que c'etait pas la meme chose)
Sinon voila le code complet, peut etre que ca vous parlera plus
maintenant j'ai un probleme car je veux lire les 10ers caracteres et que parfois il y en a moins de 10 (cad 9 suivis d'un espace)
que puis je faire?
Code :
|
Merci pour vos réponses
Marsh Posté le 16-07-2008 à 22:24:45
mauvais code.
int c;
while ((c = fgetc(...)) != EOF) {
if (c == 'x') ...
}
Marsh Posté le 16-07-2008 à 22:38:19
Oué, avec scanf() c'est un peu plus lisible ....
Code :
|
Marsh Posté le 16-07-2008 à 22:39:10
Ok merci.
JE sais pas pourquoi j'y avais pas pensé s:s
Merci pour vos reponses
Marsh Posté le 16-07-2008 à 22:40:25
fscanf s'arrete à l'espace (la j'en suis sur )
et fgets doit connaitre le nombre de caracteres
Marsh Posté le 16-07-2008 à 23:14:26
fatloui a écrit : fscanf s'arrete à l'espace (la j'en suis sur ) |
Raté, les scanfs s'arrêtent au pattern que tu rentres. D'ailleurs, c'est pour ca qu'on évite les %s dedans (sauf à spécifier leur taille, ce que fait tpierron)
fatloui a écrit : et fgets doit connaitre le nombre de caracteres |
Non, c'est l'appelant qui doit spécifier une taille. fgets ne devine rien. Rien n'empeche d'ailleurs de l'appeler récursivement jusqu'à obtenir une ligne de taille très grande, c'est fait pour. A toi de gérer ton buffer de manière adéquate.
Marsh Posté le 17-07-2008 à 09:05:00
Elmoricq a écrit : Parce qu'on est en C et que getline c'est du C++ |
crap j'y étais presque
Marsh Posté le 17-07-2008 à 10:37:14
Merci pour votre aide.
Je met mon code tout beau qui fonctionne bien si ca peut aider quelqu'un
Code :
|
(meme si je pense que vu sa specificité ca aidera pas grand monde)
Marsh Posté le 17-07-2008 à 20:07:03
Tu n'as pas lu tous les commentaires ...
Vérifie le type de retour de fgetc ...
lorsque fgetc te renvoie EOF, tu fais un tour de boucle avec une donnée invalide
Marsh Posté le 18-07-2008 à 09:40:43
theshockwave a écrit : Tu n'as pas lu tous les commentaires ... |
euh... ah bon?
theshockwave a écrit : Vérifie le type de retour de fgetc ... |
Oki j'avais pas fait gaffe, merci !
(j'étais trop pressé que ca marche )
Marsh Posté le 18-07-2008 à 10:54:40
theshockwave a écrit : Tu n'as pas lu tous les commentaires ... |
Je comprends pas la nature pessimiste des gens, toujours vouloir d'abord tester une fin de fichier avant de lire quoique ce soit.
C'est pourtant simple: tu lis encore et encore, et si ça fait un EOF, bah tu gères.
Faire l'inverse, ça me fait penser à l'histoire du démineur belge.
Marsh Posté le 18-07-2008 à 11:23:13
Taz a écrit : |
C'est mon message qui est en réponse, mais ta réponse s'adresse à fatloui, c'est ca ?
Marsh Posté le 18-07-2008 à 15:47:03
oui, parce que je suis d'accord avec toi, le but de ma remarque plus haut était de lui faire mettre le c=fgetc(fichier); dans la condition du while comme tu l'avais suggéré plus haut ...
J'en profite pour remettre une couche sur le fait que fgetc retourne un int et que le dernier code suggéré par fatloui le colle toujours dans un char, ce qui n'est toujours pas correct.
Marsh Posté le 18-07-2008 à 16:08:54
J'ai fait ca pour ne pas avoir de decalage dans ma lecture de fichier
et certainement pas parce que je lis pas les post. Regarde la différence entre mon code avant et apres et tu verra que j'y ai tenu compte.
De plus non le fgetc renvoi un char et non pas un int :
http://doc.domainepublic.net/php/d [...] fgetc.html
Marsh Posté le 18-07-2008 à 16:31:47
fatloui a écrit : De plus non le fgetc renvoi un char et non pas un int : |
Mais heu, c'est la doc de php que tu montres là. Ton programme est en langage C, et en C, ça retournes un int.
Marsh Posté le 18-07-2008 à 16:32:48
fatloui a écrit : J'ai fait ca pour ne pas avoir de decalage dans ma lecture de fichier |
c'est une description pour la fonction en php!
regarde ici:
http://nicolasj.developpez.com/articles/erreurs/
Marsh Posté le 18-07-2008 à 20:52:08
otan pour moi
j'etais tellement pressée d'avoir raison que j'ai ouvert la premiere page
Marsh Posté le 18-07-2008 à 21:52:21
Reply
Marsh Posté le 16-07-2008 à 16:57:43
Bonjour,
Je viens à nouveau solliciter l'aide des HFRiens.
Je lis les characteres d'un fichier et je souhaite m'arreter au retour chariot
mais ca ne fonctionne pas et je comprend pas pourquoi.
temp est un char * et le code ascii du retour chariot est bien 13
pi etre que le C ne prend pas en compte le retour chariot mais j'ai rien trouver à ce sujet.
Merci pour vos reponses
Message édité par fatloui le 09-07-2009 à 16:01:57