fread函数 和 feof函数

本文详细解析了C语言中用于从文件流读取数据的fread函数,包括其参数、使用方法及常见返回值解释。通过具体代码示例展示了如何使用fread函数读取文件内容,并在遍历读取的数据时处理可能出现的文件尾或错误情况。

fread(从文件流读取数据)
相关函数 fopen,fwrite,fseek,fscanf

表头文件 #include<stdio.h>

定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明 fread()用来从文件流中读取数据。
参数stream为已打开的文件指针,
参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。

Fread()会返回 实际 读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。

返回值 返回实际读取到的nmemb数目。

附加说明

范例 #include<stdio.h>
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
main()
{
FILE * stream;
int i;
stream = fopen(“/tmp/fwrite”,”r”);
fread(s,sizeof(struct test),nmemb,stream);
fclose(stream);
for(i=0;i<nmemb;i++)
printf(“name[%d]=%-20s:size[%d]=%d\n”,i,s[i].name,i,s[i].size);
}

执行 name[0]=Linux! size[0]=6
name[1]=FreeBSD! size[1]=8
name[2]=Windows2000 size[2]=11


========================

feof(检查文件流是否读到了文件尾)
相关函数 fopen,fgetc,fgets,fread

表头文件 #include<stdio.h>

定义函数 int feof(FILE * stream);

函数说明 feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。

返回值 返回非零值代表已到达文件尾。

`fread` 是 C 标准库中用于从文件流中**读取数据块**的函数,通常用于读取**二进制文件**或进行**高效的数据读取**。 --- ## ✅ `fread` 函数原型 ```c size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); ``` --- ## ✅ 参数说明 | 参数名 | 类型 | 说明 | |--------|------|------| | `ptr` | `void *` | 指向目标内存块的指针,用于存储从文件中读取的数据 | | `size` | `size_t` | 每个数据项的大小(以字节为单位) | | `nmemb` | `size_t` | 要读取的**数据项的数量** | | `stream` | `FILE *` | 指向 `FILE` 对象的指针,表示要读取的文件流 | --- ## ✅ 返回值 - **返回值类型:`size_t`** - **含义:实际读取的完整数据项数量** - 如果读取到文件末尾或发生错误,返回值可能小于 `nmemb` --- ## ✅ 举个例子说明参数如何使用 ```c #include <stdio.h> int main() { FILE *file = fopen("data.bin", "rb"); if (!file) { perror("无法打开文件"); return 1; } int buffer[10]; // 用于存储读取的整型数据 size_t items_read; // 从文件中读取最多 10 个 int 类型的数据 items_read = fread(buffer, sizeof(int), 10, file); printf("成功读取了 %zu 个整数\n", items_read); fclose(file); return 0; } ``` --- ## ✅ 参数详细解释 ### 1. `void *ptr` - 指向一个内存块,用于接收读取的数据。 - 可以是数组、结构体、动态分配的内存等。 - 例如:`char buffer[1024];`、`int arr[10];`、`char *data = malloc(1000);` --- ### 2. `size_t size` - 每个数据项的大小(单位是字节)。 - 常用 `sizeof()` 来指定,例如: - `sizeof(char)` = 1 字节 - `sizeof(int)` = 通常为 4 字节 - `sizeof(struct MyStruct)` = 结构体的大小 --- ### 3. `size_t nmemb` - 要读取的**数据项个数**。 - 实际读取的字节数 = `size * nmemb` - 如果文件剩余字节数不足以读取这么多项,`fread` 会尽可能多地读取并返回实际读取的项数。 --- ### 4. `FILE *stream` - 文件指针,必须是已经成功打开的文件流。 - 通常使用 `fopen` 打开文件,例如: - `"r"`:文本只读 - `"rb"`:二进制只读(推荐用于 `fread`) --- ## ✅ 返回值详解 - 返回值是 `size_t` 类型,表示**成功读取的完整数据项个数**。 - 例如: - 如果 `fread(...)` 返回 `5`,说明成功读取了 5 个完整的数据项。 - 如果返回 `0`,说明没有读取到任何数据(可能文件已经读完)。 - **不能仅凭返回值判断是否出错**,应结合 `feof()` `ferror()` 判断: ```c if (feof(file)) printf("到达文件末尾\n"); if (ferror(file)) printf("读取文件出错\n"); ``` --- ## ✅ 使用 `fread` 一次性读取整个文件内容的完整示例 ```c #include <stdio.h> #include <stdlib.h> int main() { FILE *file = fopen("example.txt", "rb"); if (!file) { perror("无法打开文件"); return 1; } // 获取文件大小 fseek(file, 0, SEEK_END); long file_size = ftell(file); fseek(file, 0, SEEK_SET); // 分配内存 char *buffer = (char *)malloc(file_size + 1); if (!buffer) { perror("内存分配失败"); fclose(file); return 1; } // 使用 fread 一次性读取文件内容 size_t bytes_read = fread(buffer, sizeof(char), file_size, file); if (bytes_read != (size_t)file_size) { fprintf(stderr, "读取文件时发生错误\n"); free(buffer); fclose(file); return 1; } buffer[file_size] = '\0'; // 添加字符串结束符 printf("文件内容为:\n%s\n", buffer); free(buffer); fclose(file); return 0; } ``` --- ## ✅ 总结对比表 | 参数 | 含义 | 示例 | |------|------|------| | `ptr` | 数据存储的内存地址 | `buffer`、`array`、`malloc()` 分配的内存 | | `size` | 每个数据项的大小(字节) | `sizeof(int)`、`sizeof(char)` | | `nmemb` | 要读取的数据项个数 | `100`、`1024` | | `stream` | 文件指针 | `fopen("file.bin", "rb")` | | 返回值 | 成功读取的完整数据项数 | `size_t items = fread(...)` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值