EndOfFile in C – EOF

Qu’est-ce que vous mettez pour terminer le programme, -1, ne fonctionne pas:

#include  //copy input to output main() { char c; c = getchar(); while(c != EOF) { putchar(c); c = getchar(); } } 

Je suis d’accord avec toutes les autres personnes dans ce fil en disant utiliser int c pas char .
Pour terminer la boucle (au moins sur les systèmes * nix), vous devez appuyer sur Ctrl-D pour envoyer EOF .

En outre, si vous souhaitez que vos personnages soient répercutés instantanément, réécrivez votre code comme suit:

 #include int main(void) { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); fflush(stdout); /* optional, instant feedback */ } return 0; } 

Macro: int EOF

Cette macro est une valeur entière renvoyée par plusieurs fonctions pour indiquer une condition de fin de fichier ou une autre situation d’erreur. Avec la bibliothèque GNU, EOF est -1 . Dans d’autres bibliothèques, sa valeur peut être un autre nombre négatif.

La documentation de getchar indique qu’il renvoie le prochain caractère disponible, transtypé en caractère unsigned char , puis renvoyé dans une valeur de retour int .

La raison en est de s’assurer que tous les caractères valides sont renvoyés sous forme de valeurs positives et qu’ils ne se comparent jamais comme étant égaux à EOF , une macro dont le résultat est un entier négatif.

Si vous mettez la valeur de retour de getchar dans un caractère, alors, selon que le caractère de votre implémentation est signé ou non signé, vous risquez une détection non EOF de EOF , ou de ne jamais détecter EOF même quand vous le devriez.

La signalisation EOF à la bibliothèque C se produit généralement automatiquement lors de la redirection de l’entrée d’un programme à partir d’un fichier ou d’un processus canalisé. Le faire de manière interactive dépend de votre terminal et de votre shell, mais généralement sous unix, il est réalisé avec Ctrl-D et sous Windows Ctrl-Z sur une ligne à part.

vous devriez utiliser int et non char

Si la valeur entière renvoyée par getchar () est stockée dans une variable de type char, puis comparée à la constante de nombre entier EOF, la comparaison peut ne jamais aboutir, car l’extension de signe d’une variable de type char lors de l’élargissement à l’entier est définie par l’implémentation. . – standard POSIX opengroup

Si char est unsigned par défaut pour votre compilateur (ou quelle que soit l’option utilisée pour appeler le compilateur), il est probable que

 (c == EOF) 

ne peut jamais être vrai. Si sizeof(unsigned char) < sizeof( int) , ce qui est à peu près toujours vrai, alors la promotion du caractère dans un entier ne donnera jamais une valeur négative et EOF doit être une valeur négative.

C'est une des raisons pour lesquelles toutes (ou du moins beaucoup sinon toutes) les fonctions de la norme C traitant ou renvoyant des caractères spécifient int tant que paramètre ou type de retour.

EOF n’est pas un caractère réel ou une séquence de caractères. EOF indique la fin du fichier ou du stream d’entrée, c’est-à-dire la situation où getchar() tente de lire un caractère au-delà du dernier.

Sous Unix, vous pouvez fermer un stream d’entrée interactif en tapant CTRLD . Dans cette situation, getchar() renvoie EOF . Mais si un fichier contient un caractère dont le code ASCII est 4 (c’est-à-dire CTRLD ), getchar() renverra 4, pas EOF .

Cela fonctionne toujours avec le type de données char . Mais les astuces vérifient la condition dans la boucle avec la valeur int .

Premièrement: vérifions cela. si vous écrivez le code suivant comme

 printf("%d",getchar()); 

Et puis, si vous saisissez le clavier A, vous devriez voir 65 qui est la valeur ASCII du A ou, si vous donnez CTRLD, voyez -1 .

Alors que si vous implémentez cette logique, le code de résolution est

 #include int main() { char c; while ((c = getchar()) != EOF){ putchar(c); //printf("%c",c); // this is another way for output } return 0; } 

salut je pense que c’est becoz dans un stream -1 n’est pas un mais deux caractères et le ascii pour aucun d’entre eux est -1 ou tout ce qui est utilisé pour EOF