news 2026/4/23 14:37:36

getc 和 fread区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
getc 和 fread区别

一 概述

getc 和 fread 都是C语言中用于读取文件的函数,但它们在设计目的、使用方式和性能上有显著区别。

二 基本定义

1 getc()
int getc(FILE *stream);

(1) 从文件中读取单个字符。
(2) 返回读取的字符(转换为 int 类型)。
(3)遇到文件结束或错误时返回 EOF。

2 fread()


size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

(1)批量读取数据。
(2)可以读取任意类型的数据块。
(3)返回成功读取的元素个数。

三 主要区别对比

特性 getc() fread()
读取单位 单个字符 数据块(任意大小)
返回值 读取的字符 成功读取的元素数量
效率 相对较慢 效率更高(批量读取)
缓冲区使用 标准I/O缓冲区 读取到用户缓冲区
数据类型 只能读取字符 可读取任意数据类型

四 代码示例对比

1 使用 getc() 逐字符读取


#include <stdio.h>

int main() {
FILE *fp = fopen("file.txt", "r");
if (!fp) return 1;

int ch;
while ((ch = getc(fp)) != EOF) {
putchar(ch); // 处理每个字符
}

fclose(fp);
return 0;
}

2 使用 fread() 批量读取


#include <stdio.h>

int main() {
FILE *fp = fopen("data.bin", "rb");
if (!fp) return 1;

char buffer[1024];
size_t bytes_read;

// 每次读取最多1024字节
while ((bytes_read = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
// 处理buffer中的数据
fwrite(buffer, 1, bytes_read, stdout);
}

fclose(fp);
return 0;
}

五 详细分析

1 性能差异

(1) getc():每次调用都有函数开销,适合小文件或需要逐字符处理的场景。
(2) fread():一次系统调用读取大量数据,减少I/O次数,适合大文件。

2 二进制文件处理


// 读取结构体数组
struct Student {
int id;
char name[20];
float score;
};

struct Student students[10];
size_t count = fread(students, sizeof(struct Student), 10, fp);
// getc() 无法直接实现这种功能

3 错误处理


(1)getc() 错误处理
int ch = getc(fp);
if (ch == EOF) {
if (feof(fp)) {
printf("到达文件末尾\n");
} else if (ferror(fp)) {
printf("读取错误\n");
}
}

(2) fread() 错误处理
size_t items = fread(data, sizeof(int), 100, fp);
if (items < 100) {
if (feof(fp)) {
printf("只读取了 %zu 个元素\n", items);
}
if (ferror(fp)) {
printf("读取错误\n");
}
}

六 选择建议

1 使用 getc() 的情况:

1 需要等待用户的输入。
2 需要检查每个字符的特殊情况。
3 文件很小或性能不是关键因素。

2 使用 fread() 的情况:

1 读取文件(如文本 、图像、音频)。
2 批量读取结构体或数组。
3 需要高性能的大文件读取。
4 网络数据传输。

七 混合使用示例
// 先读取头部信息,再逐字符处理
FILE *fp = fopen("mixed.dat", "rb");

// 用fread读取文件头
struct Header hdr;
fread(&hdr, sizeof(struct Header), 1, fp);

// 用getc逐字符读取后续内容
int ch;
while ((ch = getc(fp)) != EOF) {
// 处理每个字符
}

fclose(fp);

八 总结

(1) getc() 是字符级的读取,简单但效率较低。
(2) fread() 是块级的读取,适合高性能数据处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:44:07

Dify 密码重置方法(官方命令行工具推荐)

Dify 密码重置方法&#xff08;官方命令行工具推荐&#xff09; 在使用 Docker Compose 部署 Dify 环境时&#xff0c;如果需要重置管理员密码&#xff0c;官方提供的命令行工具是最直接且安全的方法。下面我将详细说明操作步骤。1. 确认服务正在运行 首先&#xff0c;需要确保…

作者头像 李华
网站建设 2026/4/23 13:45:10

Thinkphp和Laravel框架的基于Web的社区活动志愿者报名服务管理系统的设计_wa70f4s8

目录系统设计概述技术架构对比核心功能模块扩展性与安全性总结项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理系统设计概述 ThinkPHP和Laravel框架均适用于开发基于Web的社区活动志愿者报名服务管理系统。系统核心功能包括用户注册与认证、活动发…

作者头像 李华
网站建设 2026/4/23 13:45:18

数据库分片和分区

1.分片Database Sharding是一种 水平拆分&#xff08;Horizontal Partitioning&#xff0c;按行拆分&#xff09; 的方案&#xff0c;用来解决单机数据库在数据量、并发量上的瓶颈问题。&#xff08;垂直拆分是指按列的字段拆分。&#xff09;一句话定义&#xff1a;把同一张逻…

作者头像 李华
网站建设 2026/4/23 8:21:23

MySQL 中如何进行 SQL 调优

重点 平时进行 SQL 调优,主要是通过观察慢 SQL,然后利用 explain 分析查询语句的执行计划,识别性能瓶颈,优化查询语句。 1) 合理设计索引,利用联合索引进行覆盖索引的优化,避免回表的发生,减少一次查询和随机 I/O 回表&#xff1a;索引无法满足查询所需的所有列数据&#xff0c…

作者头像 李华
网站建设 2026/4/23 9:44:32

专业的TP公司主要是做什么的呢?

TP&#xff08;Tmall Partner&#xff0c;天猫合作伙伴&#xff09;公司是经天猫等主流电商平台官方认证的专业代运营机构&#xff0c;凭借对平台规则的深度掌控、成熟的运营方法论与丰富的资源储备&#xff0c;成为品牌布局天猫等核心电商渠道的重要战略伙伴。在品牌线上化竞争…

作者头像 李华
网站建设 2026/4/22 19:12:18

mysql WITH的多种用法与示例

在 MySQL 中&#xff0c;WITH 语句&#xff08;或称为公用表表达式&#xff0c;Common Table Expressions&#xff0c;简称 CTE&#xff09;用于定义一个临时结果集&#xff0c;可以在查询的其他部分中重复引用。通常用在复杂查询中&#xff0c;方便将查询逻辑分解为多个部分&a…

作者头像 李华