2009-05-13 6 views
1

Lors de la lecture d'un tuyau sous Linux (C, fread/similaire), lorsque EOF est atteint, comment peut-il être connu combien d'octets ont été lus? Si je lis des blocs à la fois, fread() ne retourne le nombre de blocs entiers lu, et je ne peux pas lire un octet à la fois parce que c'est trop lent. Bien sûr, ftell() renvoie -1.Nombre d'octets lus à partir d'un tuyau

Répondre

6

Vous pouvez le faire avec fread() en définissant le size param sur 1 et définir le nmembers à la taille que vous voulez. Ensuite, le nombre de « membres » est le nombre d'octets et vous pouvez toujours avoir un tampon de taille décente:

char  buf[8192]; 
size_t n; 
n = fread(buf, 1, sizeof buf, f); 

au lieu de

char  buf[8192]; 
size_t n; 
n = fread(buf, sizeof buf, 1, f); 
+0

aura-t-il lu beaucoup à la fois (rapide), ou lire un à un (lent)? Je pense que « l'un à la fois » est pourquoi il a à la fois la taille et compte des arguments, non seulement un argument de taille. – c4757p

+0

Heureusement pour nous, il va lire autant que possible, jusqu'à la taille '* nmembers' octets. – dwc

+1

@ c4757p, la taille et le nombre sont là pour encourager exprimer clairement une lecture des n éléments d'un tableau. Ils n'ont aucun effet (autre que leur total) sur les appels read() sous-jacents. – RBerteig

1

read() retourne le nombre d'octets lus (quand rien ne se passe mal).

Questions connexes