Incompréhension EOF ET NULL
Dernière réponse : dans Programmation
Bonsoir a tous
Pourquoi la boucle s'arrête quand fgetc renvoie EOF et quand fgets renvoie NULL ?
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à...
Pourquoi la boucle s'arrête quand fgetc renvoie EOF et quand fgets renvoie NULL ?
while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
do
{
caractereActuel = fgetc(fichier); // On lit le caractère
printf("%c", caractereActuel); // On l'affiche
} 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à...
Autres pages sur : incomprehension eof null
Lassé par la pub ? Créez un compte
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?
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?
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:
3) fgets : http://www.koders.com/c/fid042417FA231704B84308A66E1B82...
fgetc : http://www.koders.com/c/fid1C78E965ADBB97B40ABA60C2B157...
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:
char *chaine; while ((chaine = fgets(TAILLE_MAX, fichier)) != NULL) { ... }
3) fgets : http://www.koders.com/c/fid042417FA231704B84308A66E1B82...
fgetc : http://www.koders.com/c/fid1C78E965ADBB97B40ABA60C2B157...
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
Pourquoi dans ce code la fonction strlen() calcule que la longueur de la dernière ligne et non tout le contenu de mon tableau ?
ps: Merci pour les liens
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
Pourquoi dans ce code la fonction strlen() calcule que la longueur de la dernière ligne et non tout le contenu de mon tableau ?
#define TAILLE_MAX 1000
int main(int argc, char *argv[])
{
FILE* fichier = NULL;
char chaine[TAILLE_MAX] = "";
fichier = fopen("test.txt", "r");
if (fichier != NULL)
{
while(fgets(chaine, TAILLE_MAX, fichier) != NULL)
{
printf("%s\n", chaine);
}
printf("Longueur de chaine est : %d\n", strlen(chaine));
fclose(fichier);
}
return 0;
}
ps: Merci pour les liens
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
Pourquoi dans ce code la fonction strlen() calcule que la longueur de la dernière ligne et non tout le contenu de mon tableau ?
#define TAILLE_MAX 1000 int main(int argc, char *argv[]) { FILE* fichier = NULL; char chaine[TAILLE_MAX] = ""; fichier = fopen("test.txt", "r"); if (fichier != NULL) { while(fgets(chaine, TAILLE_MAX, fichier) != NULL) { printf("%s\n", chaine); } printf("Longueur de chaine est : %d\n", strlen(chaine)); fclose(fichier); } return 0; }
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.
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
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"...
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"...
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.
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.
Lassé par la pub ? Créez un compte