web-dev-qa-db-fra.com

Qu'est-ce que EOF dans le langage de programmation C?

Comment voyez-vous la dernière impression? En d'autres termes, que mettre pour l'EOF? J'ai vérifié les définitions et il est indiqué EOF est -1.

Et si vous entrez Ctrl-D, vous ne verrez rien.

#include <stdio.h>

int main() {
 int c;
 while((c = getchar() != EOF)) {
  printf("%d\n", c);
 }
 printf("%d - at EOF\n", c);
}
34
Chris_45

Sur les systèmes Linux et OS X, le caractère à saisir pour provoquer un EOF est Ctrl-D. Pour Windows, c'est Ctrl-Z.

Selon le système d'exploitation, ce caractère ne fonctionnera que s'il s'agit du premier caractère d'une ligne, c'est-à-dire le premier caractère après un Enter. Étant donné que l'entrée de la console est souvent orientée ligne, le système peut également ne pas reconnaître le caractère EOF jusqu'à ce que vous l'ayez suivi avec un Enter.

Et oui, si ce caractère est reconnu comme EOF, votre programme ne verra jamais le caractère réel. Au lieu de cela, un programme C obtiendra un -1 De getchar().

45
Carl Smotricz

Vous devez changer votre parenthèse en

while((c = getchar()) != EOF)

Parce que l'opérateur "=" a une priorité inférieure à l'opérateur "! =". Ensuite, vous obtiendrez les résultats attendus. Votre expression est égale à

while (c = (getchar()!= EOF))

Vous obtenez les deux 1 en sortie, car vous faites la comparaison "c! = EOF". Cela deviendra toujours un pour le caractère que vous avez entré, puis le "\ n" qui suit en appuyant sur Retour. Sauf pour la dernière comparaison où c est vraiment EOF cela vous donnera un 0.

EDIT sur EOF: EOF est généralement -1, mais cela n'est pas garanti par la norme. La norme définit uniquement environ EOF dans la section 7.19.1:

EOF qui se développe en une expression constante entière, avec le type int et une valeur négative, qui est retournée par plusieurs fonctions pour indiquer la fin du fichier, c'est-à-dire, plus aucune entrée d'un flux;

Il est raisonnable de supposer que EOF est égal à -1, mais lorsque vous utilisez EOF vous ne devez pas tester par rapport à la valeur spécifique, mais plutôt utiliser la macro.

27
Lucas

La valeur de EOF est un entier négatif pour le distinguer des valeurs "char" comprises entre 0 et 255. Il s'agit généralement de -1, mais il peut s'agir de tout autre nombre négatif. selon les spécifications POSIX, vous ne devez donc pas supposer qu'il s'agit de -1.

Le caractère ^ D est ce que vous tapez dans un flux de console sous UNIX/Linux pour lui dire de terminer logiquement un flux d'entrée. Mais dans d'autres contextes (comme lorsque vous lisez un fichier), ce n'est qu'un autre caractère de données. Quoi qu'il en soit, le caractère ^ D (signifiant la fin de l'entrée) ne parvient jamais au code d'application.

Comme @Bastien le dit, EOF est également renvoyé si getchar() échoue. À strictement parler, vous devez appeler ferror ou feof pour voir si le EOF représente une erreur ou une fin de flux. Mais dans la plupart des cas, votre application fera la même chose dans les deux cas.

7
Stephen C

EOF signifie fin de fichier. C'est un signe que la fin d'un fichier est atteinte et qu'il n'y aura plus de données.

Modifier:

Je me suis trompé. Dans ce cas, ce n'est pas une fin de fichier. Comme mentionné, il est transmis lorsque CTRL + d (linux) ou CTRL + z (windows) est transmis.

4
Ikke

Quelques fautes de frappe:

while((c = getchar())!= EOF)

au lieu de:

while((c = getchar() != EOF))

Getchar () traite également une touche de retour comme une entrée valide, vous devez donc la mettre également en mémoire tampon. EOF est un marqueur pour indiquer la fin de l'entrée. Il s'agit généralement d'un entier avec tous les bits définis.


#include <stdio.h>
int main()
{
 int c;
 while((c = getchar())!= EOF)
 {
  if( getchar() == EOF )
    break;
  printf(" %d\n", c);
 }
  printf("%d %u %x- at EOF\n", c , c, c);
}

impressions:

49 
 50 
 - 1 4294967295 ffffffff- à l'EOF

pour entrée:

 1 
 2 
 <ctrl-d> 
4
sud03r

les entrées d'un terminal ne "se terminent" jamais vraiment (à moins que le périphérique ne soit déconnecté), mais il est utile d'entrer plus d'un "fichier" dans un terminal, donc une séquence de touches est réservée pour indiquer la fin de l'entrée. Sous UNIX, la traduction de la séquence de touches en EOF est effectuée par le pilote de terminal, donc un programme n'a pas besoin de distinguer les terminaux des autres fichiers d'entrée. Par défaut, le pilote convertit un caractère Control-D au début d'une ligne dans un indicateur de fin de fichier. Pour insérer un caractère Control-D réel (ASCII 04) dans le flux d'entrée, l'utilisateur le précède avec un caractère de commande "quote" (généralement Control-V). AmigaDOS est similaire mais utilise Control-\au lieu de Control-D.

Dans DOS et Windows de Microsoft (et dans CP/M et de nombreux systèmes d'exploitation DEC), la lecture à partir du terminal ne produira jamais d'EOF. Au lieu de cela, les programmes reconnaissent que la source est un terminal (ou un autre "périphérique de caractères") et interprètent un caractère ou une séquence réservé donné comme un indicateur de fin de fichier; le plus souvent, il s'agit d'un ASCII Control-Z, code 26. Certains programmes MS-DOS, y compris des parties du shell Microsoft MS-DOS (COMMAND.COM) et des programmes utilitaires du système d'exploitation (tels que comme EDLIN), traitez un Control-Z dans un fichier texte comme marquant la fin de données significatives et/ou ajoutez un Control-Z à la fin lors de l'écriture d'un fichier texte. Cela a été fait pour deux raisons:

  1. Compatibilité descendante avec CP/M. Le système de fichiers CP/M n'a enregistré les longueurs de fichiers que par multiples de "enregistrements" de 128 octets, donc par convention un caractère Control-Z a été utilisé pour marquer la fin des données significatives si elles se terminaient au milieu d'un enregistrement. Le système de fichiers MS-DOS a toujours enregistré la longueur d'octet exacte des fichiers, donc cela n'a jamais été nécessaire sur MS-DOS.

  2. Il permet aux programmes d'utiliser le même code pour lire les entrées d'un terminal et d'un fichier texte.

3
redtone

pour faire simple: EOF est un type entier avec la valeur -1. Par conséquent, nous devons utiliser une variable entière pour tester EOF.

1
Jency
#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
        printf("%d\n", c);
    }
    printf("%d - at EOF\n", c);
}

Je pense que c'est la bonne façon de vérifier la valeur de l'EOF. Et j'ai vérifié la sortie.

Pour INPUT: abc et Enter, j'ai obtenu OUTPUT: 97 98 99 10. (les valeurs ASCII)

Pour INPUT Ctrl-D, j'ai obtenu OUTPUT: -1 - à EOF. Je pense donc que -1 est la valeur pour EOF.

Essayez d'autres entrées au lieu de Ctrl-D, comme Ctrl-Z. Je pense que cela varie d'un compilateur à l'autre.

1
srikanth rongali