2009-12-03 14 views
0

J'ai un fichier. J'ai lu la taille du fichier. Ensuite, je boucle la lecture de deux octets à la fois jusqu'à ce que j'arrive à la fin du fichier. Après chaque opération de lecture, j'augmente la position actuelle de 2, mais la position ne s'incrémente pas après avoir atteint la moitié de la taille du fichier, l'opération fread lit 0 octet.C-programmation ftell fseek fread, lire la taille d'un fichier

le programme lit la taille du fichier. J'effectue fread (2 bytes à chaque fois) jusqu'à ce que la position actuelle soit égale à la taille du fichier. Il lit 22915 byes pour la taille de fichier Il incrémente la position de 2 après chaque lecture, mais lorsque la position actuelle atteint 11459, soit la moitié de la taille du fichier, il lit zéro octet et passe ainsi dans une boucle infinie.

FILE *file; 
char *file_name; 
int readCount = 0; 
int position = 0; 
int fileSize; 
unsigned short mem_accesses; 

file_name = "sample.txt"; 

/** open the file */ 
file = fopen(file_name, "rb"); 
fseek(file, 0, SEEK_END); 
fileSize = ftell(file); 
rewind(file); 


while(position<fileSize){ 
    mem_accesses = getNumberAccesses(); 
    printf("position: %d filesize: %d\n",position, fileSize); 

} 

unsigned short getNumberAccesses(){ 
/** calculate number of accesses for process */ 
unsigned short val; 

readCount = fread(&val, sizeof(val), 2, file); 

position += readCount; 
printf("read count: %d\n", readCount); 

return val; 
} 
+1

Je ne vois aucune question ici. Quelle est ta question? – abelenky

Répondre

8
readCount = fread(&val, sizeof(val), 2, file); 

Cette déclaration lit deux éléments de deux octets chacun. Et il renvoie la valeur , pour le nombre d'éléments lus. Les deuxième et troisième paramètres multipliés ensemble indiquent fread combien d'octets lire.

+1

+1 pour repérer que – Yacoby

+0

merci. J'ai chagé sizeof (val) à sizeof (char) merci – user69514

+0

@OP: Vous devriez avoir changé '... sizeof (val), 2 ...' à '... 1, sizeof (val) ... '. –

1

fread renvoie le nombre d'éléments lus, et non le nombre d'octets. (Incidemment, dans votre code, vous lui donnez par erreur un nombre d'éléments de 2 qui provoque un dépassement de tampon).

Vous devriez vérifier la valeur de retour de fread afin de ne pas tomber dans des boucles infinies en cas d'erreur. Au lieu d'interroger la taille du fichier, j'appellerais simplement fread (ou d'autres fonctions d'entrée) dans une boucle jusqu'à la fin du fichier.