Représentant EOF en code C?

Le caractère de retour à la ligne est représenté par "n" dans le code C. Existe-t-il un équivalent pour le caractère de fin de fichier (EOF)?

26
demandé sur static_rtti 2012-09-12 17:39:20

10 réponses

EOF n'est pas un caractère (dans la plupart des systèmes d'exploitation modernes). C'est simplement une condition qui s'applique à un flux de fichiers lorsque la fin du flux est atteinte. La confusion survient parce qu'un utilisateur peut signaler EOF pour l'entrée de la console en tapant un caractère spécial (par exemple Control-D sous Unix, Linux, et al), mais ce caractère n'est pas vu par le programme en cours d'exécution, il est intercepté par le système d'exploitation qui, à son tour, signale

Remarque: dans certains très vieux d'exploitation systèmes EOF était un caractère, par exemple Control-Z dans CP / M, mais c'était un hack brut pour éviter la surcharge de maintenir les longueurs de fichiers réelles dans les répertoires du système de fichiers.

51
répondu Paul R 2014-01-10 22:36:18

Non. EOF n'est pas un caractère, mais un État du filehandle.

Bien qu'il existe des caractères de contrôle dans le jeu de caractères ASCII qui représentent la fin des données, ceux-ci ne sont pas utilisés pour signaler la fin des fichiers en général. Par exemple EOT (^D) qui, dans certains cas, signale presque la même chose.

Lorsque la bibliothèque C standard utilise un entier signé pour renvoyer des caractères et utilise -1 pour la fin du fichier, c'est en fait juste le signal pour indiquer qu'une erreur s'est produite. Je ne pas avoir la norme C disponible, mais pour citer SUSv3:

Si l'indicateur de fin de fichier pour le flux est défini, ou si le flux est à la fin du fichier, l'indicateur de fin de fichier pour le flux doit être défini et fgetc () doit renvoyer EOF. Si une erreur de lecture se produit, l'indicateur d'erreur pour le flux doit être défini, fgetc() doit renvoyer EOF, et doit définir errno pour indiquer l'erreur.

7
répondu pmakholm 2012-09-12 13:58:01

EOF n'est pas un personnage. Cela ne peut pas être: un fichier (binaire) peut contenir n'importe quel caractère. Supposons que vous ayez un fichier avec des octets toujours croissants, allant 0 1 2 3 ... 255 et encore une fois 0 1 ... 255, pour un total de 512 octets. Quel que soit l'un de ces 256 octets possibles que vous jugez EOF, le fichier sera coupé court.

C'est pourquoi getchar() et coll. retourne un int. La plage de valeurs de retour possibles est celle qu'un char peut avoir, plus une valeur int authentique EOF (définie dans stdio.h). C'est aussi pourquoi conversion de la valeur de retour en char avant la vérification de EOF ne fonctionnera pas.

Notez que certains protocoles ont des caractères "EOF". ASCII " a "en Fin de Texte", "Fin de Transmission", "Fin du Bloc de Transmission" et "Fin de Support". D'autres réponses ont mentionné les anciens OS'es. J'ai moi-même entré ^D sur Linux et ^Z sur les consoles Windows pour arrêter de donner des programmes d'entrée. (Mais les fichiers lus via des tuyaux peuvent avoir des caractères ^D et ^Z n'importe où et ne signalent EOF que lorsqu'ils sont à court d'octets.) C les chaînes se terminent par le caractère '\0', mais cela signifie également qu'elles ne peuvent pas contenir le caractère '\0'. C'est pourquoi toutes les fonctions de données C non-string fonctionnent en utilisant un tableau char (pour contenir les données) et un size_t (pour savoir où les données se terminent).

Edit: la norme C99 §7.19.1.3 stipule:

Les macros sont [...]
EOF
qui se développe en une expression constante entière, avec le type int et une valeur négative, qui est renvoyée par plusieurs les fonctions de indiquer fin de fichier , c'est-à-dire, plus d'entrée d'un flux;

5
répondu aib 2012-09-12 15:25:34

J'ai lu tous les commentaires. Il est intéressant de remarquer ce qui se passe lorsque vous imprimez ceci:

printf("\nInteger =    %d\n", EOF);             //OUTPUT = -1
printf("Decimal =    %d\n", EOF);               //OUTPUT = -1
printf("Octal =  %o\n", EOF);                   //OUTPUT = 37777777777
printf("Hexadecimal =  %x\n", EOF);             //OUTPUT = ffffffff
printf("Double and float =  %f\n", EOF);        //OUTPUT = 0.000000
printf("Long double =  %Lf\n", EOF);            //OUTPUT = 0.000000
printf("Character =  %c\n", EOF);               //OUTPUT = nothing

Comme nous pouvons le voir ici, EOF N'est pas un personnage (que ce soit).

2
répondu Carlos W. Mercado 2018-02-16 15:28:53

Le caractère EOF reconnu par L'interpréteur de commandes sous Windows (et MSDOS, et CP/M) est 0x1a (décimal 26, alias CTRL+Z alias SUB)

Il peut encore être utilisé aujourd'hui par exemple pour marquer la fin d'un en-tête lisible par l'homme dans un fichier binaire: si le fichier commence par "Some description\x1a" l'utilisateur peut vider le contenu du fichier sur la console en utilisant la commande TYPE et le vidage s'arrêtera au caractère EOF , c'est-à-dire imprimer Some description et arrêter, au lieu de continuer avec les ordures qui suivent.

1
répondu Axel Rietschin 2014-09-01 20:00:57

La valeur de EOF ne peut être confondue avec aucun caractère réel.

Si a= getchar(), alors nous devons déclarer a assez grand pour contenir toute valeur de getchar() retourne. Nous ne pouvons pas utiliser char puisque a doit être assez grand pour contenir EOF en plus des caractères.

1
répondu Harsh Vardhan 2016-03-27 14:01:55

La réponse est non, mais...

Vous pouvez confondre en raison du comportement de fgets()

À Partir de http://www.cplusplus.com/reference/cstdio/fgets/ :

Lit les caractères du flux et les stocke en tant que chaîne C dans str jusqu'à ce que les caractères (num-1) aient été lus ou soit une nouvelle ligne ou la fin du fichier soit atteinte, selon ce qui arrive en premier.

1
répondu betontalpfa 2017-02-23 10:50:44

Cela dépend du système mais souvent -1. Voir ici

0
répondu onoma 2012-09-12 13:42:40

Il y a la constante EOF de type int, trouvée dans stdio.h. Il N'y a pas de caractère littéral équivalent spécifié par une norme.

0
répondu Lundin 2012-09-12 13:42:51

Je pense que cela peut varier d'un système à l'autre, mais une façon de vérifier serait d'utiliser simplement printf

#include <stdio.h>
int main(void)
{
    printf("%d", EOF);
    return 0;
}

Je l'ai fait sur Windows et -1 a été imprimé sur la console. Espérons que cette aide.

0
répondu Keith Miller 2012-09-12 13:43:40