news 2026/6/10 18:20:16

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/6/8 6:52:26

医疗OCR用Tesseract稳缩写识别

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 医疗OCR中Tesseract的稳定缩写识别&#xff1a;技术挑战与创新实践目录医疗OCR中Tesseract的稳定缩写识别&#xff1a;技术挑战与创新实践 引言&#xff1a;当缩写成为医疗数据的“隐形障碍” 一、医疗OCR缩写识别&#…

作者头像 李华
网站建设 2026/6/2 17:37:58

专科生必看!8个降AI率工具,高效避坑指南

专科生必看&#xff01;8个降AI率工具&#xff0c;高效避坑指南 AI降重工具&#xff1a;高效避坑的必备利器 随着人工智能技术的快速发展&#xff0c;越来越多的专科生在撰写论文时开始使用AI工具进行辅助。然而&#xff0c;AI生成的内容往往存在明显的“AI痕迹”&#xff0c;不…

作者头像 李华
网站建设 2026/6/10 18:19:09

Linux用户、组创建

#创建指定组ID的xixi组 groupadd -g 3001 xixi#创建指定用户ID的ADMIN用户&#xff0c;并加入进xixi组 useradd -u 3001 -G xixi ADMIN #创建指定用户ID的APP用户&#xff0c;并加入进xixi组 useradd -u 3002 -G xixi APP#设置两用户密码永不过期 chage -M 99999 ADMIN chage -…

作者头像 李华
网站建设 2026/6/10 1:05:33

AI 外设接入 + 本地模型指定路径部署,FlowyAIPC v4.0.3 正式发布

【2026年01月06日】FlowyAIPC 全新 v4.0.3 版本正式发布&#xff0c;本次更新重点围绕「会议纪要反馈机制」「本地模型部署位置」以及「AI鼠标外设」同时对部分硬件配置下的功能策略进行了调整。 本地模型支持自定义部署位置 模型不再被“固定在一个路径里” 针对本地模型体…

作者头像 李华
网站建设 2026/6/2 19:29:30

‌为什么供应商报价有13%和3%两种增值税?‌

为什么供应商报价有13%和3%两种增值税&#xff1f;‌ 13%税率‌&#xff1a;适用于‌一般纳税人‌销售‌货物、加工修理修配劳务、有形动产租赁‌等业务。例如&#xff1a;销售手机、电脑、机械设备、汽车配件、工业原材料等。 3%征收率‌&#xff1a;适用于‌小规模纳税人‌的…

作者头像 李华