如何让fread最后一次读取时返回实际大小而不是
时间: 2024-03-09 07:50:44 浏览: 61
当使用 fread 函数读取文件时,如果读到文件末尾,则返回值会小于请求读取的字节数。如果希望在读取到文件末尾时返回实际大小而不是小于请求大小的值,可以在调用 fread 函数之前使用 ftell 函数获取文件当前位置,然后在调用 fread 函数之后再次使用 ftell 函数获取文件位置,计算两次位置之差即可得到实际读取的字节数。
下面是一个示例代码:
```
#include <stdio.h>
int main() {
FILE *fp;
long int start, end, size;
char buffer[1024];
fp = fopen("test.txt", "rb");
if (fp == NULL) {
printf("Failed to open file\n");
return -1;
}
start = ftell(fp);
fseek(fp, 0, SEEK_END);
end = ftell(fp);
fseek(fp, 0, SEEK_SET);
size = end - start;
fread(buffer, size, 1, fp);
printf("Actual size read: %ld bytes\n", size);
fclose(fp);
return 0;
}
```
在这个示例中,我们首先使用 ftell 函数获取文件开始位置,然后使用 fseek 函数将文件指针移动到文件末尾,并再次使用 ftell 函数获取文件结束位置。然后我们计算两次位置的差,即实际读取的字节数。最后,我们使用 fread 函数读取文件,读取的字节数为实际大小,而不是请求大小。
需要注意的是,如果文件的大小超过了 ftell 函数返回值的最大值,这种方法可能不会正确地计算实际读取的字节数。在这种情况下,可以使用其他方法来计算实际读取的字节数,例如使用 fseek 函数将文件指针移动到文件末尾之前的位置,然后读取文件的最后部分。
阅读全文