10
votes

Comment utiliser lire () pour lire les données jusqu'à la fin du fichier?

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);
}


2 commentaires

Pas le problème IMEDIAIDE (Read Retours 0, pas EOF) Mais vous devez probablement avoir l'habitude de compiler avec GCC -Wall , prenez note des avertissements (et corrigez-les!) Et #include Lorsque vous utilisez lisez / écrire .


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 :)


3 Réponses :


22
votes

Lire 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.


2 commentaires

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 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 été atteint, -1 est retourné et errno = egain. Au moins, c'est ma compréhension.



3
votes

Vous devez vérifier les erreurs. Sur certaines erreurs (communes) que vous souhaitez appeler à nouveau!

Si LIRE () renvoie -1, vous devez vérifier errno pour le code d'erreur. Si errno est égal à eagain ou eintr , vous souhaitez redémarrer le Lecture () 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))

Exemple: Un emballage appelé xread () du code source de GIT


0 commentaires

0
votes

posix rasys retour == 0 pour la fin du fichier

http://pubs.opengroup.org/onlinepubs/9699919799/fonctions /read.html

Si aucun processus ne peut être ouvert pour écrire, lire () doit renvoyer 0 pour indiquer la fin de fichier.

Ceci confirme La réponse de Jerry .

EOF est renvoyé par certaines fonctions ANSI, par ex. Man GetC dit:

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.

Ungetc () renvoie C sur succès ou EOF sur erreur.

Vous ne pouvez toujours pas l'utiliser pour distinguer l'erreur et la fin du fichier dans ce cas, Feof est nécessaire.

Voir aussi: Comment Utilisez EOF pour parcourir un fichier texte en C?


0 commentaires