news 2026/5/1 5:01:25

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/21 21:14:04

JavaWeb相关环境安装

这篇博客我们讲一下JavaWeb相关得环境安装&#xff0c;用来后续完成前后端的项目部署。 1&#xff0c;JDK 1&#xff0c;下载安装包 下载安装包大家可以去官网进行下载&#xff0c;为了方便起见大家可以直接通过我提供的链接进行下载&#xff1a;JDK安装包&#xff0c;将下载后…

作者头像 李华
网站建设 2026/4/29 14:13:38

多模态理解与生成综述(一):前言、分类及架构

序言 基于多模态理解与生成综述阶段性回顾当前进展projects: https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models/tree/Unified paper: https://www.techrxiv.org/users/993777/articles/1355509-a-survey-of-unified-multimodal-understanding-and-generat…

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

大模型行业完全指南:从职位细分到产业生态,程序员必学收藏

文章系统梳理了大模型行业的完整产业链&#xff0c;从底层算力到应用落地&#xff0c;详细分析了各环节的核心职位与人才需求&#xff0c;包括算法研发、NLP、系统部署、多模态处理、语音识别及安全治理等方向。深入探讨了六大细分领域&#xff1a;训练研发、基础设施、应用产品…

作者头像 李华
网站建设 2026/4/13 21:36:59

限时公开!9款AI写论文神器,维普查重一把过无痕!

紧急预警&#xff1a;论文DDL只剩72小时&#xff1f;AI工具能救你&#xff01; 凌晨3点的图书馆、满屏飘红的查重报告、导师第8次打回的修改意见——这是不是你论文季的真实写照&#xff1f; 据《2025年高校论文写作现状调研》显示&#xff1a;78%的研究生曾因论文进度滞后失…

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

MySql 8.0安装教程(windows系统),全网最详细的教程

目录 前言安装步骤安装包下载 前言 MySQL数据库服务是一个完全托管的数据库服务&#xff0c;是目前比较流行的开源数据库来部署云原生应用程序&#xff0c;不管在企业开发&#xff0c;个人开发&#xff0c;学校做项目都是必备的一款工具&#xff0c;并且MySQL是开源的&#…

作者头像 李华