C语言补习课——文件篇
来源:黑马程序员
第157讲 C语言操作文件概述
读取文件:输入流
写文件:输出流
读写的方向判断取决与参照,一般我们站在程序的角度判断读写方向。

第158讲 路径
基本概念
路径就是指文件在电脑中的位置,eg:C:\Users\Administrator\Desktop
表示方式
①绝对路径
例如:C:\Users\Administrator\Desktop
绝对路径以盘符作为起始标志,除非认为改动位置是固定所以叫绝对路径。
②相对路径
例如:aaa\a.txt
相对于当前项目而言的位置。
第159讲 转义字符
C语言中路径以字符串形式存在。
\在C语言中代表一个转义字符(改变后面这个符号原本的含义);"代表字符串的开头或者结尾。
所以在代码中如果想要打印\和“,需要先在前面加上转义字符。
正确打印当前文件位置的代码:
#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\FilePath\\files\\file demo.txt";printf("%s\n", path);return 0;
}
注意点
文件路径的末尾必定是一个带有文件格式标识的文件名称(例如:a.txt)!
第160讲 利用fgetc一次读一个字节
文件操作流程
①打开文件 fopen
②读数据 fgetc (file get char,一次读一个字节) fgets(file get string,一次读一行)
fread(跨行处理)
③关闭文件 fclose
函数介绍
fopen
函数原型:
FILE *fopen(const char *path, const char *mode);
形参介绍:
path 参数指定了要打开文件的路径和名称。
mode 参数指定了文件的打开模式(如只读、只写、追加等)。
mode 参数的一些常用值包括:

一般视频、音频、图片的文件格式是二进制类型,本节课操作文本文件。
作用拓展:
使用 fopen 打开文件后,可以通过一系列的输入/输出函数(如 fread、fwrite、fprintf、fscanf、fgets、fputs 等)对文件进行读写操作。完成文件操作后,应使用 fclose 函数关闭文件,以释放与 FILE 对象相关联的资源。
冷知识
部分C++编译器中里面char *path="hello"会报错“const char*类型不能用来初始化char*类型”,解决方法也是队中多样的。
fgetc
函数原型:
int __cdecl fgetc(_Inout_ FILE* _Stream);
形参介绍:Stream 是指向 FILE 对象的指针,该对象标识了要从中读取字符的文件流。
返回值:读取成功则返回读取到的字符,读不到就返回-1。
fclose
函数原型:
int fclose(FILE* _Stream);
形参介绍:Stream:指向 FILE 对象的指针,该对象标识了要关闭的文件流。这个 FILE 指针是通过之前对 fopen、freopen 或 fdopen 的调用获得的。
返回值:如果文件成功关闭,fclose 函数返回 0。
如果关闭文件时发生错误,返回 EOF。EOF 是一个在 <stdio.h> 中定义的宏,通常用于表示文件结束或错误条件。
操作实例
①在工程文件内新建一个文本文件,随意写入一行字符。
②修改编码格式为ANSI,步骤如下:
(1)点击文件->另存为;

(2)点击编码,选择为ASNI(少了这一步会输出中文乱码)。

③开始编程。
#include <stdio.h>
#include <stdlib.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\Fgetc\\files\\file demo.txt";FILE* file = fopen(path, "r");/*调试if (file == NULL) {perror("Error opening file");return EXIT_FAILURE; }int c = fgetc(file);if (c != EOF) {printf("%c\n", c);}else {printf("No characters read or file is empty.\n");}fclose(file);return EXIT_SUCCESS; *//*待改进int c = fgetc(file);printf("%c", c);c = fgetc(file);printf("%c", c);c = fgetc(file);printf("%c", c);c = fgetc(file);printf("%d", c);fclose(file);*/int c;while ((c=fgetc(file))!=-1){printf("%c", c);}fclose(file);return 0;
}
输出结果:

第161讲 利用fgets一次读一行数据
fgets函数介绍
函数原型:
char *fgets(char *str, int n, FILE *stream);
形参介绍:
str:指向用于存储读取到的字符串的字符数组。
n:指定要读取的最大字符数(包括最后的空字符\0)。如果读取的字符数(不包括最后的空字符)达到了n-1,函数将停止读取,并在字符串末尾添加一个空字符\0。
stream:指向 FILE 对象的指针,该对象标识了要从中读取数据的输入流。
返回值:
如果成功读取到字符串,fgets 函数返回 str 的地址。
如果读取失败(例如,遇到文件结束符或发生错误),则返回 NULL。
如果在读取任何字符之前已经到达文件末尾,则 str 的内容保持不变,并返回一个空指针。
使用示例
#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\Fgets\\poetry\\静夜思.txt";FILE* file = fopen(path, "r");char buffer[1024] = "";char* str;while ((str= fgets(buffer, 1024, file))!=NULL) {printf("%s\n", str);}fclose(file);return 0;
}
输出结果:

注意事项
①fgets每次读取一行数据,以换行符(按下回车键或者叫"\n")为准。
②如果读不到了就会返回NULL。
第162讲 利用fread一次读多个字节
fread函数介绍
函数原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
形参介绍:
void *ptr:指向用于存储读取数据的缓冲区的指针。
size_t size:每个数据项的大小(以字节为单位)。
size_t nmemb:要读取的数据项的最大数量。
FILE *stream:指向 FILE 对象的指针,该对象标识了要从中读取数据的输入流。
返回值:
成功时,fread 返回实际读取的元素数量,这可能会小于请求的数量 nmemb,尤其是在遇到文件结束(EOF)或发生错误时。
如果发生错误或到达文件末尾前没有读取任何数据,则返回 0。
代码示例
#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\Fread\\poetry\\静夜思.txt";FILE* file = fopen(path,"r");char buff[1024];int num = fread(buff, 1, 1024, file); //获取文件中的元素数量,24个汉字字符(包括标点)*2byte+3个换行符*1byte=51byteprintf("%d\n", num);printf("%s",buff);fclose(file);return 0;
}
输出结果

注意细节
①Windows64位系统中英文字母占用1个字节,中文字符占用2个字节。
②fread在读取时每次尽可能会把数组装满,返回当前读取到的有效字节数
假设文件为100个字节,数组长度为30;那么接下来读取的流程为:
第一次,读取前面30个字节,把数组给装满,函数返回30;
第二次,读取后面30个字节,把数组给装满,函数返回30;
第三次,读取后面30个字节,把数组给装满,函数返回30;
第四次,读取剩余的10个字节,会把数据放在数组当中,函数返回10;
第五次:没有数据可以被读取了,函数返回0。
所以可以利用这个特性改进代码:
char* path = "E:\\0_C&C++ Projects\\C\\Fread\\poetry\\静夜思.txt";FILE* file = fopen(path,"r");char buff[100];int num ; while ((num = fread(buff, 1, 100, file)) != 0){for (int i = 0; i <num ; i++) {printf("%c",buff[i]); //注意%c后不能有其他东西}}fclose(file);return 0;
while循环内判断是否到达到达文件末尾,for循环遍历字符数组打印。
输出结果:

第163讲 三种写出数据的方式
基本概念
写出数据就是把程序中的数据,写到本地文件中永久存储。
书写步骤
1 打开文件 fopen
2 写数据 fputc fputs fwrite
3 关闭通道 fclose
文件读写模式

fputc
函数原型:
int fputc(int _Character, FILE* _Stream);
形参介绍:_Character是想要写入的字符的ASCII值,_Stream是指向目标文件的指针。
返回值:如果写入成功,函数返回写入的字符的ASCII码值;如果写入失败(例如,由于磁盘空间不足或文件是只读的),则返回EOF(在stdio.h中定义的宏,通常表示-1)。
fputs
函数原型:
int fputs(char const* _Buffer,FILE* _Stream);
形参介绍:_Buffer是指向要写入文件的字符串的指针;_Stream是指向 FILE 对象的指针,该对象标识了要写入的文件流。
返回值:写出成功返回非负数,建议忽略
fwrite
函数原型:
fwrite( void const* _Buffer, size_t _ElementSize, size_t _ElementCount,FILE* _Stream);
形参介绍:
_Buffer:这是一个指向数据的指针,这些数据将被写入到文件中。注意,由于这是一个 void 类型的指针,所以它可以指向任何类型的数据。但是,你需要确保传递给 _ElementSize 的值正确反映了每个数据元素的大小。
_ElementSize:这是每个数据元素的大小(以字节为单位)。它告诉 fwrite 每个数据项占用的字节数。
_ElementCount:这是要写入文件的数据元素的数量。fwrite 会尝试写入指定数量的数据元素到文件中。
_Stream:这是一个指向 FILE 对象的指针,该对象标识了要写入数据的文件流。
返回值:fwrite 函数返回成功写入的数据元素的数量。注意,这个数量可能小于我们请求的 _ElementCount,特别是当文件系统的空间不足或发生其他错误时。如果发生错误,我们可以检查 ferror 函数的返回值来确定是否发生了错误。
代码示例
#include <stdio.h>int main()
{char* path = "E:\\0_C&C++ Projects\\C\\FileWrite\\Myfiles\\myfile.txt";FILE* file=fopen(path, "w");//ASCII值a->97int c=fputc(97,file);printf("%c\n", c);char* str = "\n银瓶乍破水浆迸";int n=fputs(str,file);printf("%d\n", n);char message[20] = "\n铁骑突出刀枪鸣";int num=fwrite(message,1,17,file);printf("%d\n", num);fclose(file);return 0;
}
输出结果:

文件里面的现状:

第164讲 多种读写模式
fopen的小细节
fopen(path,"w");如果要写出的文件不存在,编译器可以创建文件,但必须保证前面的文件夹是存在着的。如果文件已经存在,会把原文件清空。
fopen(path,"a");a=append追加写出
fopen的一些其他模式

第165讲 拷贝文件
纯文本文件在打开数据源时可以使用r、w、a模式,通俗地讲windows系统中的记事本可以打开地文件就叫做纯文本文件,例如存储文字地txt、md文件、歌词文件lrc文件等。
代码示例
#include <stdio.h>int main()
{//打开数据源char* path = "D:\\readme.txt";FILE* fScource = fopen(path,"r");//复制文件路径char* newpath = "E:\\0_C&C++ Projects\\C\\FileCopy\\Container\\copy.txt";FILE* fCopy = fopen(newpath, "w");//利用循环读取数据char arr[1024];int n;while ((n=fread(arr,1,1024, fScource))!=0){fwrite(arr,1,n, fCopy);}fclose(fScource);fclose(fCopy);return 0;
}
相关文章:
C语言补习课——文件篇
来源:黑马程序员 第157讲 C语言操作文件概述 读取文件:输入流 写文件:输出流 读写的方向判断取决与参照,一般我们站在程序的角度判断读写方向。 第158讲 路径 基本概念 路径就是指文件在电脑中的位置,eg…...
【可测试性实践】C++ 单元测试代码覆盖率统计入门
引言 最近在调研C工程怎么做单元测试和代码覆盖率统计,由于我们工程有使用Boost库,尝试使用Boost.Test来实现单元测试并通过Gcov和Lcov来生成代码覆盖率报告。本文记录完整的搭建测试Demo,希望能带来一定参考。 常用C单测框架对比 特性Goo…...
C++笔记---list
1. list的介绍 list其实就是就是我们所熟知的链表(双向循环带头结点),但其是作为STL中的一个类模板而存在。 也就是说,list是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型&…...
JavaWeb开发中为什么Controller里面的方法是@RequestMapping?
在Java Web开发中,尤其是在使用Spring MVC框架时,RequestMapping注解被广泛应用于Controller层的方法上,这是因为RequestMapping是Spring MVC提供的一个核心注解,用于将HTTP请求映射到相应的处理器类或处理器方法上。通过这种方式…...
若依移动版使用微信小程序打开失败
现象 解决办法:删掉自带的appid...
精准控图工具 Concept Sliders:超好用的 控制 Lora 适配器
Concept Sliders 你有没有遇到这样的情况?你花费大量时间制作提示和寻找种子,以使用文本到图像模型生成所需的图像。但是,你还需要对生成图像中的属性强度(如眼睛大小或照明)进行更细致、更精细的控制。修改提示会破坏…...
【EI会议征稿通知】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)
第四届材料工程与应用力学国际学术会议(ICMEAAE 2025) 2025 4th International Conference on Materials Engineering and Applied Mechanics 本次会议将重点讨论材料科学、应用力学等领域的最新研究进展与发展趋势。会议旨在为国内外从事这些领域研究…...
Hadoop安全之Knox
Apache Knox 是一个 REST API 网关,为 Hadoop 集群提供安全的访问方式。Knox 提供了一层保护,简化了对 Hadoop 生态系统(如 HDFS、YARN、Hive、HBase 等)中各个组件的访问,并通过单点登录 (SSO)、认证、授权和审计功能…...
SprinBoot+Vue应急信息管理系统的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…...
索尼研究的AI部门将与AI新加坡合作开发大型语言模型
索尼研究公司签署了一项合作协议,以帮助测试和优化东南亚语言一网通(SEA-LION)人工智能(AI)模型,重点关注印度语言。 索尼研究公司的AI部门将与负责开发AI新加坡(AISG)的公司合作&a…...
【OJ刷题】双指针问题
这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…...
基于SpringBoot+Vue+MySQL的校园食堂订餐
系统展示 用户前台界面 管理员后台界面 系统背景 随着信息技术的飞速发展和互联网的普及,传统校园食堂的运作模式已难以满足现代学生日益增长的便捷性、个性化需求。学生们希望能够在忙碌的学习生活中,通过更加高效、便捷的方式完成就餐选择,…...
uniapp业务实现
uni.requset添加异常判断提示,以及加载动画 /*** 该函数用于发送网络请求获取数据* 请求失败时会弹出相应的错误提示* 请求成功时会检查返回的数据是否存在错误,并根据错误代码做出相应处理* 如果数据请求成功且无错误,则将返回的数据赋值给pets变量*/fu…...
Windows和Mac命令窗快速打开文件夹
Windows explorer . 和 macOS open . 命令详解 1. Windows explorer . explorer 是 Windows 上的文件资源管理器,用于通过命令行打开文件夹或文件。 常用命令格式: explorer [选项] [目标路径]. 表示当前目录,explorer . 打开当前工作目录…...
智能制造云平台---附源码79117
目 录 摘要 1 绪论 1.1 研究背景和意义 1.2开发技术 1.2.1 Flask框架 1.2.2 Python简介 1.2.3 MySQL数据库 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2总体设计原则 2.3 系统流程分析 2.3.1 用户登录流程 2.3.2 删除信息流程 2.4 系统角色分析 2.5 系…...
降本、创新、合作,谁才是连接器行业破除内卷的关键词?
如果用一个字来评价2024年的汽车行业,那就是「卷」。 ▲中国汽车保有量不断提升 图/Pixabay 长安汽车董事长朱华荣说:“汽车行业的卷,让中国品牌达到了新高度。” 吉利董事长李书福说:“中国汽车工业内卷程度全球第一,…...
可能一拆为二,英特尔为何走到今天这一步?
【科技明说 | 科技热点关注】 近来看到外媒消息说,英特尔迫于经营压力,也不得不铤而走险,欲将英特尔一分为二,即芯片制造与芯片设计分离开,互相剥离,独立发展。 于是乎,英特尔将分拆…...
了解Redis集群概念,集群如何选举主节点
请给胡广一个免费的三连吗?感谢! 1. Redis集群 1.1 集群概念 Redis主从架构和Redis集群架构是两种不同的概念,大家刚接触Redis时经常弄混淆。胡广给大家贴下Redis官网对两者的解释。 (1)Redis主从架构 Redis主从实…...
Ozon跨境商家提升销量的关键:测评补单策略与必备条件
Ozon,自1998年创立以来,已稳居俄罗斯多品类电商领域的领导地位,不仅是俄罗斯最为人所熟知的电商品牌,更是该国电商行业的先驱之一。那么,对于希望在Ozon平台上实现销售爆单的跨境卖家而言,他们需要满足哪些…...
缺乏大模型经验,还有机会吗?
做大模型一年半,经历了无数场面试。 关于经验,我最常听到的候选人(尤其是学生)的说辞是:我没有大模型经验,可以给个机会吗?答案是,我们并不看重候选人的大模型训练经验。这里不是说经验不重要,而是大部分人…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
