完整教程:C语言文件操作函数解析

news/2026/1/19 22:03:19/文章来源:https://www.cnblogs.com/ljbguanli/p/19503830

完整教程:C语言文件操作函数解析

前言

        文件操作是C语言编程中至关重要的一部分,它连接着程序与外部世界,实现了数据的持久化存储。无论是简单的文本处理,还是复杂的数据管理,都离不开文件操作。本文将通过一系列完整的代码示例,全面解析C语言中各种文件操作函数的使用方法、适用场景以及最佳实践。从基础的字符读写到高级的文件定位,从文本模式到二进制模式,我们将深入探讨每一个细节。

目录

前言

字符级文件操作:fputc与fgetc

数据写入:fputc函数

数据读取:fgetc函数

字符串级文件操作:fputs与fgets

批量写入:fputs函数

批量读取:fgets函数

格式化文件操作:fprintf与fscanf

结构体数据写入

结构体数据读取

内存格式化:sprintf与sscanf

二进制文件操作:fwrite与fread

二进制数据写入

二进制数据读取

文件定位操作

fseek函数:随机访问

ftell函数:获取当前位置

rewind函数:重置文件指针

错误处理机制

文件操作状态检测

综合应用实例

总结

核心技术要点

实际应用建议

学习价值


字符级文件操作:fputc与fgetc

数据写入:fputc函数

FILE* pf1 = NULL;
pf1 = fopen("text1.txt", "w");
if (pf1 == NULL)
{perror("fopen");return 1;
}for (char i = 'A'; i <= 'Z'; i++)
{fputc(i, pf1);
}
fputc('\n', pf1);
for (char i = 'a'; i <= 'z'; i++)
{fputc(i, pf1);
}
fputc('\n', pf1);
for (char i = '0'; i <= '9'; i++)
{fputc(i, pf1);
}
fclose(pf1);
pf1 = NULL;

功能分析:

  • 创建并打开文件"text1.txt"用于写入

  • 分三段写入数据:大写字母、小写字母、数字

  • 每段结束后添加换行符

  • 最终生成格式化的文本文件

技术要点:

  • fputc每次写入一个字符

  • 适合精确控制每个字符的写入

  • 自动处理字符到字节的转换

数据读取:fgetc函数

FILE* pf2 = NULL;
pf2 = fopen("text1.txt", "r");
if (pf2 == NULL)
{perror("fopen");return 1;
}
char ch = 0;
while ((ch = fgetc(pf2)) != EOF)
{putchar(ch);
}
fclose(pf2);
pf2 = NULL;

功能分析:

  • 打开刚才创建的文件进行读取

  • 使用循环逐个字符读取直到文件结束

  • putchar将读取的字符输出到屏幕

技术要点:

  • fgetc返回int类型,用char接收可能有问题

  • EOF是文件结束标志,值为-1

  • 这种方式可以处理任意大小的文件

字符串级文件操作:fputs与fgets

批量写入:fputs函数

char arr1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n0123456789";
FILE* pf3 = NULL;
pf3 = fopen("text2.txt", "w");
if (pf3 == NULL)
{perror("fopen");return 1;
}
fputs(arr1, pf3);
fclose(pf3);
pf3 = NULL;

功能分析:

  • 使用单个字符串包含所有数据

  • fputs一次性写入整个字符串

  • 比逐个字符写入更高效

优势:

  • 代码更简洁

  • 执行效率更高

  • 适合已知完整内容的情况

批量读取:fgets函数

FILE* pf4 = NULL;
pf4 = fopen("text2.txt", "r");
if (pf4 == NULL)
{perror("fopen");return 1;
}
int n = sizeof(arr1) / sizeof(arr1[0])-1;
printf("n=%d", n);
char* p = (char*)malloc((n+1)*sizeof(char));
if (p == NULL) 
{perror("malloc");fclose(pf4);return 1;
}
while (fgets(p, n + 1, pf4) != NULL)
{printf("%s", p);
}
free(p);
p = NULL;
fclose(pf4);
pf4 = NULL;

技术要点:

  • fgets会读取直到换行符或指定长度减1

  • 自动在字符串末尾添加空字符

  • 需要合理设置缓冲区大小

  • 返回NULL表示读取结束或出错

格式化文件操作:fprintf与fscanf

结构体数据写入

struct S
{char name[20];int age;float score;char c;
};
struct S s = { "xiaoming",20,98.8f,'X' };
FILE* pf5 = NULL;
pf5 = fopen("text3.txt", "w");
if (pf5 == NULL)
{perror("fopen");return 1;
}
fprintf(pf5,"%s %d %f %c",s.name,s.age,s.score,s.c);
fclose(pf5);
pf5 = NULL;

功能分析:

  • 定义结构体存储复合数据

  • 使用fprintf按指定格式写入文件

  • 保持数据字段的可读性

结构体数据读取

FILE* pf6 = NULL;
pf6 = fopen("text3.txt", "r");
if (pf6 == NULL)
{perror("fopen");return 1;
}
struct S t = { 0 };
struct S u = { 0 };
fscanf(pf6, "%s %d %f %c", t.name, &(t.age), &(t.score), &(t.c));fscanf(stdin, "%s %d %f %c", t.name, &(t.age), &(t.score), &(t.c));printf("%s %d %f %c", t.name, t.age, t.score, t.c);
fprintf(stdout, "\n%s %d %f %c\n", s.name, s.age, s.score, s.c);fclose(pf6);
pf6 = NULL;

技术要点:

  • fscanf从文件按格式读取数据

  • 可以重定向到标准输入(stdin)

  • fprintf可以输出到标准输出(stdout)

  • 需要注意数据类型和指针的使用

内存格式化:sprintf与sscanf

struct M
{char name[20];int age;float score;char c;
};
struct M m = { "lihao",30,98.8f,'M' };
char o[200] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
sprintf(o,"%s %d %f %c", m.name, m.age, m.score, m.c);
printf("%s\n", o);
struct M n = { 0 };
sscanf(o, "%s %d %f %c", n.name, &(n.age), &(n.score), &(n.c));
printf("%s %d %f %c\n", n.name, n.age, n.score, n.c);

功能分析:

  • sprintf将格式化的数据写入字符串缓冲区

  • sscanf从字符串中按格式提取数据

  • 实现内存中的数据格式转换

应用场景:

  • 数据序列化和反序列化

  • 字符串处理和数据解析

  • 协议数据的组装和解析

二进制文件操作:fwrite与fread

二进制数据写入

int arr1[] = { 1,2,3,4,5 };
FILE* pf7 = fopen("test4.txt", "wb");
if (pf7 == NULL)
{perror("fopen");return 1;
}
int sz = sizeof(arr1) / sizeof(arr1[0]);
fwrite(arr1, sizeof(arr1[0]), sz, pf7);
fclose(pf7);
pf7 = NULL;

技术要点:

  • "wb"模式以二进制方式写入

  • fwrite直接写入内存数据,不进行字符转换

  • 保持数据的原始格式,适合数值数组、结构体等

二进制数据读取

int arr2[8] = { 0 };
FILE* pf8 = fopen("test4.txt", "rb");
if (pf8 == NULL)
{perror("fopen");return 1;
}
int i = 0;
int n = 0;
while (n = fread(arr2, sizeof(int), 4, pf8))
{for (int j = 0; j < n; j++){printf("%d ", arr2[j]);   }printf("\n");	
}
for (int k = 0; k < 8; k++)
{printf("%d ", arr2[k]);
}
fclose(pf8);
pf8 = NULL;

技术要点:

  • "rb"模式以二进制方式读取

  • fread返回实际读取的元素个数

  • 可以分块读取大文件

  • 保持数据精度,无字符转换损失

文件定位操作

fseek函数:随机访问

FILE* pf = fopen("test5.txt", "r");
if (pf == NULL)
{perror("fopen");return 1;
}
int ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, -4, SEEK_END);
ch = fgetc(pf);
printf("%c\n", ch);
fclose(pf);
pf = NULL;

定位模式:

  • SEEK_SET:从文件开头定位

  • SEEK_CUR:从当前位置定位

  • SEEK_END:从文件末尾定位

应用价值:

  • 实现文件的随机访问

  • 适合数据库、索引文件等场景

  • 提高大文件处理效率

ftell函数:获取当前位置

FILE* pf = fopen("test5.txt", "r");
if (pf == NULL)
{perror("fopen");return 1;
}
int ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, 0, SEEK_END);
printf("%d\n", ftell(pf));
fclose(pf);
pf = NULL;

功能:

  • 返回当前文件位置相对于开头的偏移量

  • 常用于获取文件大小

  • 结合fseek实现复杂定位

rewind函数:重置文件指针

FILE* pf = fopen("test5.txt", "r");
if (pf == NULL)
{perror("fopen");return 1;
}
int ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, -4, SEEK_END);
ch = fgetc(pf);
printf("%c\n", ch);
rewind(pf);
ch = fgetc(pf);
printf("%c\n", ch);
fclose(pf);
pf = NULL;

功能:

  • 将文件位置指针重置到开头

  • 等价于fseek(pf, 0, SEEK_SET)

  • 简化代码,提高可读性

错误处理机制

文件操作状态检测

FILE* pf = fopen("test5.txt", "r");
if (pf == NULL)
{perror("fopen");return 1;
}
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{printf("%c\n", ch);
}
if (feof(pf))
{printf("遇到文件末尾,读取正常结束\n");
}
else if (ferror(pf))
{perror("fgetc");
}
fclose(pf);
pf = NULL;

错误检测函数:

  • feof:检测是否到达文件末尾

  • ferror:检测文件操作是否出错

  • perror:输出详细的错误信息

最佳实践:

  • 每次文件操作后检查状态

  • 区分正常结束和异常结束

  • 提供有意义的错误信息

综合应用实例

FILE* pf = fopen("test5.txt", "r");
if (pf == NULL)
{perror("fopen");return 1;
}
char ch = 0;
for (ch = 'a'; ch <= 'z'; ch++)
{fputc(ch, pf);
}
if (feof(pf))
{printf("遇到文件末尾,读取正常结束\n");
}
else if (ferror(pf))
{perror("fputc");
}
fclose(pf);
pf = NULL;

代码分析:

  • 以读取模式打开文件却进行写入操作

  • 这会触发错误状态

  • 演示了错误检测机制的实际应用

总结

通过本文的全面解析,我们深入掌握了C语言文件操作的各个方面:

核心技术要点

  1. 操作粒度选择

    • 字符级:fgetc/fputc - 精确控制

    • 字符串级:fgets/fputs - 高效处理

    • 格式化:fscanf/fprintf - 结构化数据

    • 二进制:fread/fwrite - 原始数据

  2. 文件打开模式

    • 文本模式:字符转换,适合文本文件

    • 二进制模式:无转换,适合数据文件

  3. 文件定位能力

    • 随机访问:fseek + ftell

    • 重置指针:rewind

    • 大大扩展了文件处理能力

  4. 健壮性保障

    • 全面的错误检测

    • 资源泄漏预防

    • 异常情况处理

实际应用建议

  1. 根据需求选择合适函数

    • 配置文件:格式化I/O

    • 日志文件:字符串I/O

    • 数据文件:二进制I/O

    • 大文件:分块读取+定位

  2. 重视错误处理

    • 始终检查返回值

    • 区分不同错误类型

    • 保证资源正确释放

  3. 性能优化考虑

    • 缓冲区大小设置

    • 减少I/O操作次数

    • 合理使用二进制模式

学习价值

掌握这些文件操作技术,不仅能够处理日常的文件任务,更重要的是培养了系统编程的思维方式。理解数据在内存和外部存储之间的流动,对于后续学习数据库、网络编程、操作系统等高级主题都具有重要意义。

文件操作是C语言编程的基石之一,扎实掌握这些知识将为你的编程之路奠定坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序毕设项目推荐-基于微信小程序的健康生活助手系统基于django+微信小程序的健康生活系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年专业的车牌识别一体机,车牌识别系统,车牌识别道闸一体机厂家选型决策指南 - 品牌鉴赏师

引言在 2026 年,随着智慧城市建设的加速推进,车牌识别一体机、车牌识别系统以及车牌识别道闸一体机在智慧停车、交通管理等领域的应用愈发广泛。为了帮助用户更科学、客观地选择专业的厂家,本选型决策指南应运而生。…

昆仑通态直接控制变频器程序及通讯那些事儿

昆仑通态直接控制变频器程序及通讯。在工业自动化领域&#xff0c;昆仑通态人机界面与变频器的协同工作是实现精准控制与高效生产的关键环节。今天就来唠唠昆仑通态如何直接控制变频器程序及通讯。 一、通讯基础准备 昆仑通态与变频器通讯&#xff0c;首先要明确通讯协议。常见…

【课程设计/毕业设计】基于微信小程序的健康生活服务系统设计与实现基于django+微信小程序的健康生活系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026最新西南地区衣柜公司top5推荐:服务深耕四川/云南/贵州/等地优质生产厂家解析及选择指南,品质与定制力双优品牌权威榜发布. - 品牌推荐2026

随着消费升级与居住理念的迭代,中高端家装市场对定制木制品的需求呈现爆发式增长,衣柜作为全屋收纳系统的核心组件,其材质工艺、设计美学与空间适配能力成为消费者关注焦点。据中国木材与木制品流通协会2025年度报告…

基于C#的Socket通信聊天程序实战分享

socket通信聊天程序&#xff0c;计算机通信成品源码&#xff0c;聊天程序demo,C#编写&#xff0c;含服务器和客户端&#xff0c;使用socket通信&#xff0c;多线程&#xff0c;服务器可以支持多连接&#xff0c;多客户端登录&#xff0c;登录的客户端可以给在线的其它账号发送信…

2026年评价高的动态人脸识别,人脸识别考勤,人脸识别系统厂家采购参考榜单 - 品牌鉴赏师

引言在科技飞速发展的当下,动态人脸识别、人脸识别考勤以及人脸识别系统在众多领域得到了广泛应用,其市场需求日益增长。为了帮助采购方在众多的人脸识别厂家中做出更优选择,我们依据相关测评数据和多方验证结果,为…

电机NVH分析之根原因查找与谐波计算工具探索

电机NVH分析&#xff0c;根原因查找。 定子,转子谐波次数与电磁力波次数对应关系表。 excel格式&#xff0c;输入极槽等参数可以自动计算。在电机领域&#xff0c;NVH&#xff08;Noise, Vibration, Harshness&#xff0c;噪声、振动与声振粗糙度&#xff09;分析至关重要&…

2026年可靠的抽屉式配电柜,配电柜,防爆配电柜厂家优质品牌推荐 - 品牌鉴赏师

引言在当今电力行业蓬勃发展的时代,配电柜作为电力系统中不可或缺的关键设备,其质量和性能直接关系到电力供应的稳定性与安全性。为了给广大用户提供一份客观、公正、全面的配电柜厂家推荐榜单,我们依据一系列科学的…

探索光伏蓄电池离网MATLAB仿真模型

光伏蓄电池离网MATLAB仿真模型 蓄电池具有储能作用(削峰填谷) 实现光伏和蓄电池的能量双向流动 维持输出电压稳定 该模型的原理说明文档 有boost结构的MPPT和BUCK型的MPPT&#xff0c;通常是boost型的mppt电路。在当今追求可持续能源的时代&#xff0c;光伏蓄电池离网系统凭借…

MATLAB 实现滚动轴承故障诊断:基于 VMD 的振动信号分析与峭度计算

MATLAB滚动轴承故障诊断:变分模态分解(VMD)分解振动信号&#xff0c;各个本征模态函数峭度的计算在滚动轴承故障诊断领域&#xff0c;准确提取故障特征是关键。变分模态分解&#xff08;VMD&#xff09;是一种强大的信号处理方法&#xff0c;它能将复杂的振动信号分解为多个本征…

VScode点击无法运行

2026年的第一篇,记录一下今天VScode无法打开的情况:点击无反应,没有任何提示,啥也没有,相当于没点。我还以为我电脑出了问题,重启了,依旧如此。点击后,打开任务管理器,vscode确实没有运行。 在网上找了一些方…

永磁同步电机(PMSM)矢量控制之旅:从理论到MATLAB仿真

永磁同步电机(PMSM)矢量控制&#xff0c;坐标变换到d-q轴后&#xff0c;采用SVPWM调制算法&#xff0c;进行速度电流双闭环控制&#xff0c;控制算法为PID&#xff0c;仿真结果如图所示。 (默认发MATLAB R2018b版本)永磁同步电机&#xff08;PMSM&#xff09;因其高效、功率密度…

FPGA实现延时链

FPGA实现延时链之前有做一个输出100ps左右的延时链,当时找到一篇国外的论文,2015年的文章了。链接:《High-Resolution_Synthesizable_Digitally-Controlled_Delay_Lines》,根据论文的内容,要使输出的延时能够更加…

探索基于 S7 - 200 的消防泵稳压控制系统程序

基于S7-200的消防泵稳压控制系统程序基于西门子S7-209的消防稳压控制系统程序。在消防领域&#xff0c;可靠的消防泵稳压控制系统至关重要。今天咱们就来深入聊聊基于西门子 S7 - 200 的消防稳压控制系统程序。首先得知道&#xff0c;这个系统的核心目标就是确保消防管网的压力…

图像金字塔与直方图

在计算机视觉领域&#xff0c;图像金字塔与直方图是两大基础且实用的技术。图像金字塔用于处理不同分辨率的图像&#xff0c;广泛应用于图像融合、超分辨率重建等场景&#xff1b;直方图则用于描述图像像素分布&#xff0c;是图像增强、阈值分割的核心工具。本文将结合完整代码…

2026年靠谱的电力箱变压器,干式箱变压器,地埋式箱变压器厂家专业评测推荐榜 - 品牌鉴赏师

引言在 2026 年的电力行业中,箱变压器作为电力传输与分配的关键设备,其性能与质量直接影响着电力系统的稳定运行。为了给广大用户提供专业、客观、公正的厂家推荐,我们依据国内相关行业协会公开的数据形成的指南,结…

APEX实战第9篇:手把手教你集成RAS轻松实现真正的数据安全

APEX实战第9篇:手把手教你集成RAS轻松实现真正的数据安全2026-01-19 21:46 AlfredZhao 阅读(0) 评论(0) 收藏 举报在 APEX 开发的江湖里,大家都有一个共同的痛点:权限控制代码满天飞。 为了实现“张三只能看张三…

2026年知名的门禁,门禁管理系统,智能门禁管理系统厂家选购参考榜 - 品牌鉴赏师

引言在当今数字化与智能化快速发展的时代,门禁及门禁管理系统已成为保障各类场所安全与高效运营的关键设施。无论是政府机关、商业综合体,还是住宅小区、医疗机构,都对门禁系统的安全性、稳定性和智能化程度提出了更…