La documentation io.Reader
de Go indique qu'un Read()
peut renvoyer une valeur non nulle n
et une io.EOF
en même temps. Malheureusement, la méthode Read()
d'un File
ne fait pas cela.Comment tester EOF sur io.Reader dans Go?
Lorsque l'EOF est atteint et que certains octets peuvent encore être lus, la méthode Read du fichier renvoie une erreur non nulle n
et nil
. Ce n'est que lorsque nous essayons de lire quand déjà à la fin du fichier que nous obtenons zéro n
et io.EOF
comme erreur.
Je n'ai pas trouvé de méthode simple pour tester si EOF est atteint sans essayer de lire les données du fichier. Si nous effectuons un Read() avec un tampon de 0 octet, nous obtenons zéro erreur n
et nil
bien que nous soyons à la fin du fichier.
Pour éviter cette dernière lecture, la seule solution que j'ai trouvée est de garder une trace moi-même du nombre d'octets restant à lire dans le fichier. Y a-t-il une solution plus simple?
pas AFAIK. vous pouvez peut-être utiliser seek ou quelque chose pour obtenir la position actuelle mais comme il faudra plus de syscalls, il sera plus lent. –
Pourquoi ne pas faire un type qui _always_ lit quelques octets et renvoie EOF? – JimB
@JimB C'est un truc incroyable. Je vais adopter cette solution. Mais au lieu de lire à l'avance, je garderai une trace des octets restants à lire pour que je puisse retourner io.EOF juste à temps. La raison pour laquelle je l'aime le plus est que je n'ai pas besoin de modifier le code n'importe où dans mon programme. J'ai seulement besoin de fournir un wrapper à File. Si vous écrivez une bonne réponse avec les deux options, je vous l'accorde. – chmike