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

时间:2009-12-03 23:31:28

标签: c file-io fread fseek

我有一个档案。我读了文件的大小。然后我一次循环读取两个字节,直到我到达文件的末尾。在每次读取操作之后,我将当前位置递增2,但是当我达到文件大小的一半后,位置不会增加,fread操作将读取0个字节。

程序读取文件大小。我执行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;
}

2 个答案:

答案 0 :(得分:8)

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

此语句读取两个两个字节的项目。对于读取的项目数,它返回值 2 。第二个和第三个参数相乘,告诉fread要读取多少字节。

答案 1 :(得分:1)

fread返回读取的元素数,而不是字节数。

(顺便说一句,在你的代码中,你错误地给它一个元素数为2,导致缓冲区溢出)。

你应该检查fread的返回值,这样你就不会在出错的情况下遇到无限循环。

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