使用fread返回值时需要注意,返回值不一定是读取到的字节数
函数原型
//每次读取size个 读取nmemb次
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//每次写入size个 读取nmemb次
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
返回值
RETURN VALUE
On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1.
解析:当size=1的时候,返回值为读取/写入的字节数,如果size不为1则返回值不为字节数。
返回读写的次数,如果size=1,则返回值为读到的字节数。
比较返回值与fread时间
int get_string()
{
FILE *fp;
fp = fopen("flow.txt","r");
if(fp == NULL)
{
printf("open flow error\n");
return -1;
}
int ret=-1;
char buf[512];
struct timeval start, end;
int interval;
gettimeofday(&start, NULL);
ret = fread(buf,1,26*5,fp);
gettimeofday(&end, NULL);
interval = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("ret1=%d\t",ret);
printf("interval = %f\n\n", interval/1000.0);
fseek(fp,0L,SEEK_SET);
gettimeofday(&start, NULL);
ret = fread(buf,26*5,1,fp);
gettimeofday(&end, NULL);
printf("ret2=%d\t",ret);
interval = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("interval = %f\n\n", interval/1000.0);
fseek(fp,0L,SEEK_SET);
gettimeofday(&start, NULL);
ret = fread(buf,1024,1,fp);
gettimeofday(&end, NULL);
printf("ret3=%d\t",ret);
interval = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("interval = %f\n\n", interval/1000.0);
fclose(fp);
return 0;
}
打印输出
ret1=130 interval = 0.005000
ret2=1 interval = 0.001000
ret3=0 interval = 0.001000
ret1 返回130,代表真实读到的字节数,因为每次只读一个字节,读取了130次,耗费时间比较大
ret2 返回1,读取1次,每次读26*5个字节,读到多少字节不知道,时间0.001000
ret3 返回0, 读取1次,每次读1024个字节 时间0.001000
ret2 ret3 读取不同的字节数量,但花费的时间一样。
ret2 ret3 返回值不同,ret3返回0,这与ret2返回的一次不同。
fwrite 的返回值也有同样的含义。
补充
If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).
如果读写期间发生错误,或者到文件的结尾,返回的值是0,这在判断异常或者读到文件尾时非常有用。具体是哪种错误需要使用feof()或ferror()来决定。
循环读取文件,使用feof判断是否读到文件尾
int main()
{
FILE *p = fopen("a.txt", "rb");
char buffer[4] = {0};
while(!feof(p)){
memset(buffer, 0, sizeof(buffer));
fread(buffer, sizeof(char), sizeof(buffer), p);
printf("buffer = %s\n", buffer);
}
return 0;
}