Votre question

Incompréhension EOF ET NULL

Tags :
  • chaine
  • Programmation
Dernière réponse : dans Programmation
19 Avril 2010 23:02:29

Bonsoir a tous :) 

Pourquoi la boucle s'arrête quand fgetc renvoie EOF et quand fgets renvoie NULL ?

  1. while (fgets(chaine, TAILLE_MAX, fichier) != NULL)



  1. do
  2. {
  3. caractereActuel = fgetc(fichier); // On lit le caractère
  4. printf("%c", caractereActuel); // On l'affiche
  5. } while (caractereActuel != EOF);


La fonction fgets() va lire une ligne jusqu'à rencontrer \n et en mettant != NULL cela sera un boucle infini ? Non? ... car le pointeur retourné par fgets est toujours (!= NULL)

En fin je suis perdu là... :cry: 

Autres pages sur : incomprehension eof null

19 Avril 2010 23:24:20

Exemple de code ??

Je sais pas si c'est moi mais j'ai rien compris à ce que tu racontes
m
0
l
19 Avril 2010 23:36:51

J'ai édité...
m
0
l
a c 232 L Programmation
19 Avril 2010 23:44:37

Parce que fgets retourne NULL une fois qu'il a fini et que fgetc retourne EOF (cf. manuels)
m
0
l
20 Avril 2010 13:05:53

Merci..

Je crois que pour vraiment comprendre je dois savoir ça :

1/ Est ce que le fonction fgets renvoie un pointeur juste pour vérifier si la lecture a bien été faite et aussi pour nous permettre de faire des boucles en faisant while fgets(...) != NULL ?

2/ Si la fonction fgets ne renvoyait pas de pointeur (chaine) est-ce qu'on aurait pu lire la chaine dans le printf ou est-ce qu'il faut qu'il nous renvoie la chaine pour pouvoir la lire?

3/ Avez vous les fonctions fgets et fgetc pour voir leur fonctionnement?
m
0
l
a c 232 L Programmation
20 Avril 2010 13:57:39

1) fgets mets le pointeur retourné dans son premier paramètre (que tu as appelé chaine), et retourne le pointeur.
A la fin, fgets retourne un pointeur NULL, donc tu peux faire un while (fgets() != NULL), mais ce n'est pas la seule utilité...

2) Comme je viens de dire, fgets retourne le pointeur dans le 1er paramètre, et dans le retour de la fonction. Donc, imaginons que tu n'aies pas de paramètre chaine, tu ferais quelque chose du genre:
  1. char *chaine;
  2. while ((chaine = fgets(TAILLE_MAX, fichier)) != NULL)
  3. {
  4. ...
  5. }


3) fgets : http://www.koders.com/c/fid042417FA231704B84308A66E1B82...
fgetc : http://www.koders.com/c/fid1C78E965ADBB97B40ABA60C2B157...

m
0
l
20 Avril 2010 18:47:05

Merci mais je vais reformulé ma question :

Pourquoi quand on envoie a la fonction fgets() l'adresse du tableau chaine en paramètre elle a besoin de renvoyer le pointeur (ici l'adresse de chaine) car je pensé qu'elle pouvait modifier (remplir) le tableau chaine directement en mémoire et pas besoin de le renvoyer??

Autre question j'ai n'ai beaucoup je sais :p 

Pourquoi dans ce code la fonction strlen() calcule que la longueur de la dernière ligne et non tout le contenu de mon tableau ?

  1. #define TAILLE_MAX 1000
  2.  
  3. int main(int argc, char *argv[])
  4. {
  5. FILE* fichier = NULL;
  6. char chaine[TAILLE_MAX] = "";
  7.  
  8. fichier = fopen("test.txt", "r");
  9.  
  10. if (fichier != NULL)
  11. {
  12.  
  13. while(fgets(chaine, TAILLE_MAX, fichier) != NULL)
  14. {
  15.  
  16. printf("%s\n", chaine);
  17.  
  18. }
  19. printf("Longueur de chaine est : %d\n", strlen(chaine));
  20. fclose(fichier);
  21. }
  22.  
  23. return 0;
  24. }


ps: Merci pour les liens :) 
m
0
l
a c 232 L Programmation
20 Avril 2010 20:19:39

zollen777 a dit :
Merci mais je vais reformulé ma question :

Pourquoi quand on envoie a la fonction fgets() l'adresse du tableau chaine en paramètre elle a besoin de renvoyer le pointeur (ici l'adresse de chaine) car je pensé qu'elle pouvait modifier (remplir) le tableau chaine directement en mémoire et pas besoin de le renvoyer??


J'ai pas compris ce que tu voulais dire là...

zollen777 a dit :
Autre question j'ai n'ai beaucoup je sais :p 

Pourquoi dans ce code la fonction strlen() calcule que la longueur de la dernière ligne et non tout le contenu de mon tableau ?

  1. #define TAILLE_MAX 1000
  2.  
  3. int main(int argc, char *argv[])
  4. {
  5. FILE* fichier = NULL;
  6. char chaine[TAILLE_MAX] = "";
  7.  
  8. fichier = fopen("test.txt", "r");
  9.  
  10. if (fichier != NULL)
  11. {
  12.  
  13. while(fgets(chaine, TAILLE_MAX, fichier) != NULL)
  14. {
  15.  
  16. printf("%s\n", chaine);
  17.  
  18. }
  19. printf("Longueur de chaine est : %d\n", strlen(chaine));
  20. fclose(fichier);
  21. }
  22.  
  23. return 0;
  24. }


ps: Merci pour les liens :) 


Parce que chaine correspond au dernier qui a été défini par fgets().
Si tu veux calculer la longueur totale, il faut avoir ton int qui contiendra la longueur de chaque chaine récupérée dans ta boucle while, et tu les additionnes à chaque fois.
m
0
l
a b L Programmation
20 Avril 2010 21:24:51

fgets renvoie le retour pour les cas d'erreur et pour simplifier l'utilisation, ça renvoie exactement le même pointeur que celui que tu lui donnes en cas de succès.
m
0
l
20 Avril 2010 21:34:30

Citation :
J'ai pas compris ce que tu voulais dire là...


Pourquoi la fonction fgets() a besoin de retourner le tableau alors qu'elle peut le remplir directement en mémoire sans avoir le besoin de retourner ce tableau ?

C'est clair ou pas?


Citation :
Parce que chaine correspond au dernier qui a été défini par fgets().
Si tu veux calculer la longueur totale, il faut avoir ton int qui contiendra la longueur de chaque chaine récupérée dans ta boucle while, et tu les additionnes à chaque fois.


Si dans mon fichier je met :

Bonjour
Salut



Alors pourquoi quand on fait une boucle while la 1ere ligne n'est pas écrasé par la 2eme dans la console :

La console affichera :

Bonjour
Salut




et non :

Salut




m
0
l
a b L Programmation
20 Avril 2010 22:07:47

C'est printf qui fait ça. Il fait lui-même une copie dans le buffer video pour l'affichage (25 lignes en général)
m
0
l
a c 232 L Programmation
20 Avril 2010 22:39:22

ton printf de chaine est dans la boucle...
ton strlen est en dehors
m
0
l
21 Avril 2010 00:35:19

En conclusion, si je mets dans mon fichier :

Bonsoir
Toto

Et que je fais une boucle alors la console affichera

Bonsoir
Toto

Mais mon tableau contiendra que Toto en mémoire ??

C'est ça ?
m
0
l
a c 232 L Programmation
21 Avril 2010 09:08:51

Bah imaginons que tu aies tes deux lignes.
La première fois que le while(...) s'exécute, il met "Bonsoir" dans la variable chaine, et est différent de null. Donc ça rentre dans la boucle while qui affiche chaine, donc ça affiche "Bonsoir".
Ensuite, vu qu'il n'y a plus rien à faire dans la boucle while, il réexécute la boucle while(), c'est toujours différent de NULL, et ça met "Toto" dans la variable chaine. Tu entres donc dans la boucle while pour la 2ème fois, et affiche chaine qui est égal à "Toto". Puis réexécute le while().
Vu que c'est la fin du fichier, le fgets() retourne NULL, donc il ne rentre pas dans la boucle, donc il n'affiche rien.
Puis il affiche la longueur de chaine, chaine comme on l'a vu au dernier passage est égal à "Toto", donc il t'affiche la longueur de "Toto"...
m
0
l
21 Avril 2010 12:51:43

Mais la console n'écrase pas Bonsoir par Toto ???? et c'est la mon incompréhension
m
0
l
a c 232 L Programmation
21 Avril 2010 14:52:11

Pourquoi veux-tu que Toto écrase Bonsoir dans la console ?
Il n'y a pas de système de remplacement dans la console, on y ajoute des choses seulement.
Tu lui donnes Bonsoir, elle écrit Bonsoir, tu lui donnes Toto, elle y ajoute Toto.
Comme CRicky t'as dit, c'est de la copie, elle n'utilise pas le pointeur de chaine.
m
0
l
21 Avril 2010 22:35:41

Merci
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS