C编程ftell fseek fread,读取文件的大小

问题描述:

我有一个文件。我读了文件的大小。然后,我一次循环读取两个字节,直到文件结束。在每次读取操作后,我将当前位置增加2,但是在达到文件大小的一半后,位置不会递增,fread操作将读取0个字节。C编程ftell fseek fread,读取文件的大小

程序读取文件大小。我执行fread(每次2个字节),直到当前位置等于文件的大小。 它读取22915个字节的文件大小 它在每次读取后将位置增加2,但是当当前位置到达11459,这是文件大小的一半时,它将读取零字节,从而进入无限循环。

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

我在这里看不到任何问题。你的问题是什么? – abelenky 2009-12-03 23:34:01

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

该声明全文的各两个字节两个项目。并返回值,读取的项目数。第二个和第三个参数相乘在一起告诉fread要读取多少个字节。

+1

+1发现 – Yacoby 2009-12-03 23:41:00

+0

谢谢。我改变了sizeof(val)到sizeof(char) 谢谢 – user69514 2009-12-03 23:53:17

+0

@OP:你应该改变'... sizeof(val),2 ...'到'... 1,sizeof(val)... '。 – 2009-12-04 00:28:38

fread返回读取的元素数量,而不是字节数。 (顺便说一句,在你的代码中,你错误地给它一个元素数为2,这会导致缓冲区溢出)。

您应该检查fread的返回值,以便在发生错误时不会遇到无限循环。

而不是查询文件大小,我只是在循环中调用fread(或其他输入函数),直到文件结束。