Bonjour à tous !
Etant débutante en C, je me pose une question...
y a t'il une différence entre EOF et '/O' pour marquer la fin d'un flot de caractères ?
Merci d'avance !![]()
Bonjour à tous !
Etant débutante en C, je me pose une question...
y a t'il une différence entre EOF et '/O' pour marquer la fin d'un flot de caractères ?
Merci d'avance !![]()
Bonjour,
Attention, c'est '\0' et non '/O'.
'\0' correspond à un caractère ayant pour valeur 0x00, il sert à marquer la fin d'une chaîne de caractère.
Dans un flux de caractère, on peut très bien avoir des caractère valant '\0'.
Pour EOF, il ne me semble pas qu'il soit réellement écris dans le flux mais qu'il serve juste à indiquer aux fonctions d'écriture de caractère qu'on souhaite fermer le flux (?) ou aux fonctions de lecture de caractères de nous indiquer que le flux est fini.
EOF étant un int, ceci permet donc de différencier facilement les caractères à lire/écrire de EOF.
Sinon je pense que ce sujet pourrais t'intéresser.
Bonjour !
Merci pour cette réponse rapide
Donc si j'ai bien compris, "/0" marquerait la fin d'une string tandis que EOF indiquerait la fin d'un flux (et le fermerait) ?![]()
Il faut faire attention car EOF n'est pas "physiquement" présent à la fin du flux.
Sinon les sockets planteraient dès qu'on essayerais de passer un int en binaire valant -1.
EOF est une valeur retournée par les fonctions de lecture pour indiquer au programmeur qu'il y a eu une erreur (fin de fichier ou autre).
Pour :
J'ai testé et cela ne ferme pas le flux (contrairement à ce que je supposais), il caste EOF en char et écrit alors 255 (ou -1) ce qui donne un caractère non-imprimable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part fputc(EOF, monFichier);
Par contre il me semblait que EOF est bien présent à la fin d'un flux particulier pour des raisons historiques, je n'en suis pas vraiment sûr et je ne saurais pas dire de quel flux il s'agissait (stdin? stdout?).
EDIT : je pense que je confond avec EOT (End Of Transmission = Ctrl+D) 0x04 et ETX (End of Texte = Ctrl+C) 0x03 qui ferment tous les deux stdin.
Bonsoir,
Attention, comme dit plus haut, c'est un anti-slash « \ » qu'il faut utiliser.
Pas tout-à-fait : « \0 » est une combinaison permettant de représenter le caractère ASCII numéro 00 exactement (qui par nature est un caractère non affichable). Et par convention, le langage C utilise un char ayant une valeur nulle comme marqueur de fin de chaîne.… tandis que EOF indiquerait la fin d'un flux (et le fermerait) ?![]()
EOF est une macro #define définie à une certaine valeur (généralement « -1 » mais cette valeur est censée être cachée aux yeux du programmeur) qui est renvoyée par fgetc() lorsque la lecture n'a pu avoir lieu. Ce n'est donc absolument pas un caractère en soi, et elle ne fait pas du tout partie du flux.
C'est la raison pour laquelle fgetc() renvoie un int et pas directement un char : il s'agit de pouvoir renvoyer toutes les valeurs possibles valides pour un caractère, plus une autre servant de marqueur en cas d'échec.
Initialement, EOF signifie bien « End Of File » parce que l'atteinte de la fin d'un fichier est un événement normal lorsqu'on lit ce fichier. On a ensuite conservé ce marqueur pour tous les autres cas où fgetc() ne peut renvoyer de caractère et il appartient alors au programmeur d'aller vérifier pourquoi on l'a reçu.
Effectivement, EOF n'est pas un caractère mais « EOT » en est bien un dans la table ASCII. Comme tu le signales, il signifie « End Of Transmission » et sert à indiquer que l'on a fini de transmettre, sur un canal qui par nature n'a pas de fin, comme un clavier. Il porte bien le numéro 4 et est donc généré par Ctrl+D.
On ne le met pas à la fin d'un fichier, mais lors d'une transmission en ASCII entre deux pairs (typiquement un terminal et le serveur central), c'était un moyen d'indiquer que l'on avait fini. En principe, sur les terminaux Unix, cette combinaison permet d'indiquer au terminal lui-même qu'on a fini et donc d'envoyer immédiatement ce qui est en attente dans le buffer, ce qui est pratique quand on utilise une discipline qui maintient une ligne dans le tampon jusqu'à l'appui sur le retour à la ligne (ce qui permet éventuellement de la corriger avant de l'envoyer) : ça permet d'envoyer un flux de caractère qui ne contient PAS le retour à la ligne.
Si la ligne est vide, alors le système reçoit une trame de zéro caractères, et les logiciels qui utilisent read(), par convention là encore, interprètent ceci comme une fin de fichier. C'est d'ailleurs pourquoi on peut quitter une session avec Ctrl+D.
Ctrl+C n'est pour ainsi dire jamais utilisé sous la forme donnée par la table ASCII, mais a été utilisé pour faire un break depuis pratiquement l'aube des ordinateurs et a été repris dans ce sens par pratiquement tous les autres systèmes. Sous Unix et dans un terminal, Ctrl+C envoie donc SIGINT au programme en cours d'exécution.
On en parlait ici.
Obsidian, j'aime ce genre de message !![]()
Partager