news 2026/1/22 18:22:58

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/1/13 11:35:15

【故障排查】WPS/Word粘贴数学公式变图片?竟是格式在“搞鬼”

【故障排查】WPS/Word粘贴数学公式变图片&#xff1f;竟是格式在“搞鬼”踩坑了&#xff01;复制WPS/Word里的数学公式&#xff0c;粘贴完居然变成图片&#xff0c;根本没法编辑。折腾半天发现&#xff0c;罪魁祸首是文档格式——把doc改成docx就搞定了&#xff01;问题很简单就…

作者头像 李华
网站建设 2026/1/16 13:21:18

AI应用架构实战:上下文工程的数据预处理

AI应用架构实战&#xff1a;上下文工程的数据预处理——让模型“听懂”你的每一句话 关键词 上下文工程 | 数据预处理 | AI应用架构 | 对话系统 | 向量数据库 | 上下文窗口 | 语义分割 摘要 在AI应用&#xff08;如对话系统、知识库问答、个性化推荐&#xff09;中&#xf…

作者头像 李华
网站建设 2026/1/18 18:53:02

OCCT-右手坐标系

一、右手坐标系的定义&#xff08;数学与工程一致&#xff09;右手坐标系&#xff08;Right-Handed Coordinate System&#xff09;规则&#xff1a;右手 食指 → X 正方向右手 中指 → Y 正方向右手 拇指 → Z 正方向三者满足&#xff1a;X Y Z也就是&#xff1a; X 轴叉乘 …

作者头像 李华
网站建设 2026/1/16 17:16:21

jvm性能调优

JVM性能调优方法调整堆内存大小 -Xms和-Xmx参数分别设置JVM堆的初始大小和最大大小。建议将两者设为相同值以避免运行时动态调整带来的性能开销。例如&#xff1a; -Xms4g -Xmx4g 根据应用需求调整大小&#xff0c;避免频繁Full GC。选择合适的垃圾回收器 根据应用特点选择垃圾…

作者头像 李华
网站建设 2026/1/22 8:39:37

超绝好用清理软件工具,(附下载方式)超多好用功能

电脑用久了&#xff0c;难免会堆积闲置软件、捆绑程序&#xff0c;自带卸载工具往往 “卸不干净”&#xff0c;残留的文件碎片和注册表垃圾不仅占用磁盘空间&#xff0c;还可能拖慢系统运行。今天给大家实测推荐三款 Windows 平台口碑爆棚的卸载工具 ——HiBit Uninstaller、Ge…

作者头像 李华