J'essaie de lire des données binaires dans un programme C avec Lecture () mais EOF Test ne fonctionne pas. Au lieu de cela, il continue à courir pour toujours lire le dernier bit du fichier.
#include <stdio.h>
#include <fcntl.h>
int main() {
// writing binary numbers to a file
int fd = open("afile", O_WRONLY | O_CREAT, 0644);
int i;
for (i = 0; i < 10; i++) {
write(fd, &i, sizeof(int));
}
close(fd);
//trying to read them until EOF
fd = open("afile", O_RDONLY, 0);
while (read(fd, &i, sizeof(int)) != EOF) {
printf("%d", i);
}
close(fd);
}
3 Réponses :
Lire code> renvoie le nombre de caractères qu'il a lu. Lorsqu'il atteint la fin du fichier, il ne pourra plus lire (du tout) et il retournera 0, pas EOF. P>
UGH: s Je sais pas comment ai-je manqué que dans le manuel, lisait-il au cours des 20 dernières minutes, merci!
Eh bien, je peux voir comment ce n'est pas évident. Après tout, on pourrait penser à de nombreuses raisons pour lesquelles 0 octets pourraient être lus. La clé est que lorsque la lecture se rencontre une erreur, elle toujours i> retourne -1, et jamais 0. Le retour 0 est le succès, fin du fichier. Afaict, même pour l'IO non bloquante, où il est possible, et parfois très probablement 0 octets sera lu, 0 n'est que retourné lorsque EOF est atteint. Le reste de l'époque, quand il y a zéro octets à lire et que EOF a pas i> été atteint, -1 est retourné et errno = egain. Au moins, c'est ma compréhension.
Vous devez vérifier les erreurs. Sur certaines erreurs (communes) que vous souhaitez appeler à nouveau! P>
Si LIRE () renvoie -1, vous devez vérifier Exemple: Un emballage appelé xread () du code source de GIT p> errno code> pour le code d'erreur. Si errno est égal à code> eagain code> ou eintr code>, vous souhaitez redémarrer le Lecture () code> appel, sans utiliser ses valeurs renvoyées (incomplètes). (Sur d'autres erreurs, vous souhaitez peut-être quitter le programme avec le message d'erreur approprié (de StreRror)) P>
posix rasys retour == 0 pour la fin du fichier strong> p>
http://pubs.opengroup.org/onlinepubs/9699919799/fonctions /read.html p>
Si aucun processus ne peut être ouvert pour écrire, lire () doit renvoyer 0 pour indiquer la fin de fichier. P>
blockQuote>
Ceci confirme La réponse de Jerry . P>
fgetc (), getc () et getchar () renvoyer le personnage lu sous la forme d'une distribution de char ou d'EOF non signé à la fin du fichier ou de l'erreur. P>
Ungetc () renvoie C sur succès ou EOF sur erreur. P>
blockQuote>
Vous ne pouvez toujours pas l'utiliser pour distinguer l'erreur et la fin du fichier dans ce cas, Voir aussi: Comment Utilisez EOF pour parcourir un fichier texte en C? P>
EOF code> est renvoyé par certaines fonctions ANSI, par ex. Man GetC CODE> dit: P>
Feof code> est nécessaire. p>
Pas le problème IMEDIAIDE (Read Retours 0, pas EOF) Mais vous devez probablement avoir l'habitude de compiler avec
GCC -Wall code>, prenez note des avertissements (et corrigez-les!) Et#include code> Lorsque vous utilisez lisez code> /écrire code>.Merci pour le conseil, j'ai cela inclus dans mon code principal où j'avais besoin de cela, mais je vais aussi utiliser -wall aussi à partir de maintenant sur :)