Je viens de lire les réponses à "Supprimer un caractère de nouvelle ligne à la fin d'un fichier" et tout le monde a dit de supprimer le dernier caractère. Ma question est, le caractère eof n'est-il pas le dernier?
Je viens de lire les réponses à "Supprimer un caractère de nouvelle ligne à la fin d'un fichier" et tout le monde a dit de supprimer le dernier caractère. Ma question est, le caractère eof n'est-il pas le dernier?
Réponses:
Un fichier ne se termine pas par un caractère de fin de fichier, comme l'indiquent correctement les réponses précédentes. Mais je pense que les réponses et commentaires contiennent des inexactitudes qui méritent d'être signalées:
Le jeu de caractères ASCII ne contient pas de caractère EOF exact. Il existe plusieurs caractères de contrôle "fin": Fin du texte (3), Fin de la transmission (4), Fin du bloc de transmission (23), Fin du support (25). Le séparateur de fichiers (28) est peut-être le plus proche d'un caractère EOF. Le code 26 est "Substitute", pas EOF.
Ctrl- Dest uniquement associé à l'entrée du terminal. Par exemple, la commande
cat filea fileb filec > outfile
n'implique pas Ctrl- D. Soit dit en passant, vous pouvez remplacer le caractère EOF du terminal par autre chose que Ctrl- Dà l'aide de la stty
commande.
À strictement parler, Ctrl- D(ou ce que vous avez changé en) n'est pas un code clé EOF. Ce qu'il fait, c'est que l' read
appel système retourne avec ce qui est disponible, tout comme appuyer sur retour fait que l'appel système lu renvoie une ligne de caractères à l'appelant. Par convention, une valeur de retour nulle de l'appel système lu (c'est-à-dire zéro caractère lu) signale une condition de fin de fichier. Cependant, le fichier d'entrée n'est pas fermé automatiquement et, si l'entrée provient du terminal, elle n'est pas mise dans un état "fin de fichier". Vous pouvez écrire un programme qui continue la lecture à partir du terminal même après une "fin de fichier" et l'appel lu peut retourner différent de zéro pour la ligne d'entrée suivante.
L'analogie entre les caractères eof et eol peut être vue si Ctrl- Dest enfoncé alors qu'une entrée a déjà été écrite sur la ligne. Par exemple, si vous écrivez "abc" et appuyez sur Ctrl- Dl'appel de lecture revient, cette fois avec une valeur de retour de 3 et avec "abc" stocké dans le tampon passé en argument. Étant donné que la lecture ne renvoie pas 0, cela n'est pas interprété comme une condition EOF par la convention ci-dessus. De même, en appuyant sur retour à, l'appel de lecture revient avec la ligne d'entrée entière (y compris la nouvelle ligne). Vous pouvez essayer cela avec la cat
commande: écrivez quelques caractères sur la ligne et appuyez sur Ctrl- D. Vous verrez les personnages vous faire écho et cat
attendre plus de commentaires.
Tout ce qui précède ne s'applique que lorsque le terminal est en mode "cuit", par opposition au mode "brut", dans lequel le traitement d'entrée de ligne est minimisé. En mode brut, un caractère Ctrl-D est réellement envoyé au tampon d'entrée.
Les caractères de contrôle ASCII ont des définitions des années 1960 (précédant en fait ce que vous pourriez considérer comme un réseau ). Tous ces caractères de contrôle ne sont pas utilisés comme ils étaient définis à l'époque pour les équipements de télécommunications.
Sur les systèmes de type Unix, il n'est pas nécessaire d'avoir un EOF
personnage; aucun n'est utilisé. Le système peut indiquer aux applications combien d'octets se trouvent dans un fichier:
Sur certains autres systèmes (vu dans VMS, DOS, Windows), un contrôle-Z peut agir comme un marqueur de fin de fichier car dans les anciennes versions, le système ne pouvait pas dire à certaines applications combien d'octets se trouvaient dans le fichier.
Dans le cas de VMS, la limitation était due à la façon dont le runtime C fonctionnait. Les applications en langage assembleur pouvaient (et ont obtenu) la bonne taille de fichier.
Les systèmes Unix dans le shell utilisent classiquement control-D pour indiquer à une application qu'une fin d'entrée (fichier) a été atteinte, mais le control-D n'est pas stocké dans le fichier.
En C, EOF
est délibérément fait -1
pour indiquer qu'il ne s'agit pas d'un caractère valide. Les E / S standard reviennent EOF
lorsqu'une condition de fin de fichier est détectée - pas un caractère spécial.
Soit dit en passant, les fichiers ne doivent pas nécessairement se terminer par un caractère de nouvelle ligne (saut de ligne ASCII). Les éditeurs de texte peuvent gérer des fichiers qui sont tous du texte imprimable mais qui n'ont pas de nouvelle ligne de fin.
busybox
les vi
, etc.).
EOF n'est pas un personnage. Il s'agit d'un état qui n'indique plus de caractères à lire dans un flux de fichiers. Lorsque vous entrez la commande EOF à partir du terminal, vous signalez au système d'exploitation de fermer le flux d'entrée, sans mettre de caractère spécial.
bash
la main sur l'entrée, elle est massée par le pilote TTY. Ce pilote intercepte Ctrl-D et envoie un EOF à bash
(Où EOF n'est pas un caractère, mais un statut de fichier spécial)