C语言fread函数的用法是什么

来源:AI社区作者:长沙GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《C语言fread函数的用法是什么》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C语言fread函数的用法是什么》有用,将其分享出去将是对创作者最好的鼓励。

fread函数是C语言标准库中用于从指定文件流读取二进制数据的函数,定义在stdio.h头文件中,常用于读取二进制文件、结构体数据等场景,和fwrite函数搭配使用可以实现二进制文件的完整读写操作。

C语言fread函数的用法是什么

fread函数的基本语法

fread函数的原型如下:

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

各个参数的含义如下:

  • ptr:指向接收读取数据的缓冲区的指针,读取到的数据会存放到这个地址对应的内存空间中
  • size:每个要读取的元素的大小,单位是字节,通常可以用sizeof运算符获取对应类型的大小
  • nmemb:要读取的元素个数
  • stream:指向要读取的文件流指针,也就是fopen函数打开文件后返回的文件指针

函数的返回值是实际成功读取的元素个数,如果返回值小于nmemb,可能是到达了文件末尾或者发生了读取错误,可以通过feof或者ferror函数判断具体原因。

fread函数的使用示例

示例1:读取二进制文件中的整数数据

下面的代码演示了如何使用fread函数读取一个包含多个整数的二进制文件:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("test.bin", "rb"); // 以二进制读模式打开文件
    if (fp == NULL) {
        printf("文件打开失败n");
        return 1;
    }
    int arr[5]; // 定义缓冲区存放读取的数据
    // 读取5个int类型的数据,每个int大小是sizeof(int)
    size_t read_count = fread(arr, sizeof(int), 5, fp);
    printf("实际读取到%d个整数n", read_count);
    for (int i = 0; i < read_count; i++) {
        printf("第%d个整数:%dn", i+1, arr[i]);
    }
    fclose(fp); // 关闭文件
    return 0;
}

示例2:读取结构体数据

fread也常用于读取自定义结构体数据,示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义结构体
typedef struct {
    int id;
    char name[20];
    float score;
} Student;

int main() {
    FILE *fp = fopen("student.bin", "rb");
    if (fp == NULL) {
        printf("文件打开失败n");
        return 1;
    }
    Student stu;
    // 读取1个Student类型的数据
    size_t read_count = fread(&stu, sizeof(Student), 1, fp);
    if (read_count == 1) {
        printf("学号:%dn", stu.id);
        printf("姓名:%sn", stu.name);
        printf("分数:%.2fn", stu.score);
    } else {
        printf("读取失败n");
    }
    fclose(fp);
    return 0;
}

fread函数的使用注意事项

  • 打开文件时需要指定正确的模式,读取二进制文件要使用rb模式,否则在部分系统上可能会出现读取错误
  • 缓冲区ptr指向的内存空间必须足够大,能够容纳size*nmemb字节的数据,否则会导致内存越界
  • 不要混淆size和nmemb的含义,size是单个元素的大小,nmemb是要读取的元素个数,两者相乘才是总共需要读取的字节数
  • 读取完成后要及时关闭文件,避免资源泄露
  • 如果读取的是文本文件,虽然也可以用fread,但更推荐使用fgets、fscanf等文本读取函数,fread更适合二进制场景

常见问题解答

为什么fread读取的返回值小于nmemb?

这种情况通常有两种原因,一是已经到达文件末尾,此时feof(stream)会返回非0值;二是发生了读取错误,此时ferror(stream)会返回非0值,可以通过这两个函数判断具体原因。

fread和fgets有什么区别?

fread是二进制读取函数,不会处理换行符等特殊字符,按照指定的字节数读取数据;fgets是文本读取函数,会读取到换行符或者文件末尾为止,并且会在读取的字符串末尾添加空字符,更适合读取文本行。

freadC语言文件读取二进制文件stdio_h修改时间:2026-07-04 23:33:22

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。