news 2026/9/25 18:37:49

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/9/25 2:42:01

CMAKE指令集

目录 1、指定CMAKE最低的版本号 2、设置工程名 3、添加可执行文件 4、简化项目名的表示 5、添加多个可执行文件 6、添加多个可执行文件的简洁方法 7、添加版本号和配置头文件 8、指定C版本 9、添加库 10、使用库 11、将库设置为可选项 如果这篇文章能帮助到你&…

作者头像 李华
网站建设 2026/9/25 4:33:26

AI写作助手测评大会

当前主流AI写作工具对比ChatGPT (OpenAI) 支持长文本生成和多轮对话&#xff0c;擅长创意写作和内容改写。提供网页版和API接口&#xff0c;订阅版可访问GPT-4模型。在学术写作和商业文案场景表现突出。Claude (Anthropic) 注重安全性和事实准确性&#xff0c;内置宪法AI约束机…

作者头像 李华
网站建设 2026/9/20 18:08:41

【必收藏】突破传统RAG瓶颈:Deep Thinking RAG架构详解与实战指南

Deep Thinking RAG是一种将RAG与Agent技术融合的新型架构&#xff0c;突破了传统RAG的局限性。它通过四个智能模块&#xff08;规划代理、检索监督者、多阶段检索漏斗、策略代理&#xff09;实现从线性链到循环图的跃迁&#xff0c;支持多跳推理、动态知识边界和自适应检索策略…

作者头像 李华
网站建设 2026/9/24 21:06:22

查询指定任务的办理时间轴

一、接口核心需求分析 你提供的这段代码是Activiti工作流中查询指定任务的办理时间轴接口&#xff0c;核心业务需求如下&#xff1a; 关联查询&#xff1a;根据传入的任务ID&#xff08;taskId&#xff09;&#xff0c;先获取对应的流程实例ID&#xff08;processInstanceId&am…

作者头像 李华
网站建设 2026/9/20 17:57:16

ubuntu系统_每天定时23:00 定时关机_怎么实现

在Ubuntu系统中设置每天23:00定时关机&#xff0c;最可靠的方法是使用系统内置的 cron 服务。下面的表格汇总了实现步骤和关键要点&#xff0c;你可以快速了解整个过程。步骤核心操作说明/命令示例1. 编辑计划任务终端中输入 sudo crontab -e使用 sudo 获取root权限&#xff0c…

作者头像 李华
网站建设 2026/9/23 21:23:58

mysql一条sql语句是如何运行的

MySQL SQL 语句执行流程MySQL 执行一条 SQL 语句的过程可以分为多个阶段&#xff0c;包括连接管理、解析与优化、执行引擎处理以及结果返回。以下是详细流程&#xff1a;连接管理客户端通过 TCP/IP 或 Unix Socket 连接到 MySQL 服务器。连接建立后&#xff0c;服务器进行身份验…

作者头像 李华