c语言操作文件
1、文件缓冲区
文件缓冲区的目的:提高访问效率 提高磁盘使用寿命
刷新就是将当前缓冲区数据全部提交。
不刷新时,程序在崩溃时缓冲区内容无法输出(有些情形会带来错误)

文件缓冲区的四种刷新方式
行刷新(遇到换行符刷新)
#include <stdio.h>
#include <stdlib.h>
void test()
{printf("画押!");while (1){;}
}int main(int argc, char const *argv[])
{test();return 0;
}
编译输出的时候没有输出任何信息,是因为没有使用 换行符号 刷新缓冲区

在printf中添加换行符号打印输出正常!

满刷新(缓冲区放满数据刷新)
缓冲区放满数据之后就会强制刷新缓冲区
强制刷新(不管缓冲区满不满,使用fflush将缓冲区强制刷新)

关闭刷新(关闭文件的时候,将缓冲区的数据全部刷新)
函数执行完毕的时候,也就是关闭执行文件的时候刷新缓冲区数据,提交数据

模拟时钟
void test()
{int i = 0;while (1){printf("\r%02d:%02d", i / 60, i % 60);sleep(1);i++;}
}

2、文件的API
文件的操作步骤:打开、读写、关闭
打开文件 fopen
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
path:文件的路径
mode:打开文件的方式
返回值:
成功:打开的文件指针
失败:NULL
函数说明:fopen是打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,并返回文件的标识
文件的打开方式mode:r w a + t b
r:只读的方式打开
w:只写的方式打开
a:追加的方式打开
+:可读可写的方式打开
t:以文本文件的方式打开(默认是省略的)
b:以二进制方式打开(必须显示说明)
组合方式:

w模式,希望是一个干净的文件,所以若存在同名文件就会删除已经存在的文件,重新创建该文件进行操作,所以谨慎使用
r+中+就是可读可写,但是r强调的是不创建新文件,如果没有r并且文件不存在就会创建新文件

w+或者wb+模式,希望是一个干净的文件,所以若存在同名文件就会删除已经存在的文件,重新创建该文件进行操作,所以谨慎使用
关闭文件 fopen
关闭保存文件信息的空间
#include <stdio.h>
int fclose(FILE *stream); //只需要传递一个文件指针
成功:返回 1
失败:返回 0


3、一次读写一个文件
一次写一个字节

#include <stdio.h>
#include <stdlib.h>
void test()
{FILE *fp = NULL;fp = fopen("ml.txt", "w");if (fp == NULL){perror("fopen");return; // 防止出现段错误,因为要是文件不存在的话,那就是一个空指针,下面直接操作空指针会出现段错误}char *f_data = "我是小明!";while (*f_data != '\0'){fputc(*f_data, fp);f_data++;}fclose(fp);
}int main(int argc, char const *argv[])
{test();return 0;
}
4、一次读一个字节
将上面的ml.txt文件一次一个字节读出
int fgetc(FILE *stream);
//从所标识的文件中读取一个字节,将字节值返回
//返回值 ://以t 的方式,读到文件结尾返回 EOF//以b 的方式,读到文件结尾,使用feof判断结尾
void test1() // 一次读一个字节
{FILE *fp = NULL;fp = fopen("ml.txt", "r");if (fp == NULL){perror("fopen");return; // 防止出现段错误,因为要是文件不存在的话,那就是一个空指针,下面直接操作空指针会出现段错误}// 当然也可以读一个打印一个字符// char f_data[128] = "";// 不能写成 char *f_data = ""这是文字常量区来存读取的数据while (1){char ch = fgetc(fp);if (ch == EOF) //EOF并不是文件中存在的,而是指针到达文件末尾的时候会自动判断出来,加上EOF{break;}printf("%c", ch);}printf("\n");fclose(fp);
}int main(int argc, char const *argv[])
{test1();return 0;
}

5、一次读写一个字符串
读取一个字符串,遇到换行符结束,读取一行文件数据
char *fgets(const char *s,FILE *stream);
//成功:返回目的数组的首地址,即s
//失败:返回空
写:
将一个文件中数据读出写入到另一个文件中
char *fgets(const char *s,FILE *stream);
#include <stdio.h>
#include <stdlib.h>
void test()
{FILE *fp_r = NULL;fp_r = fopen("ml.txt", "r"); // 从ml.txt中读出数据if (fp_r == NULL){perror("fopen");return; // 防止出现段错误,因为要是文件不存在的话,那就是一个空指针,下面直接操作空指针会出现段错误}FILE *fp_w = NULL;fp_w = fopen("b.txt", "w"); // 向b.txt文件中写入数据if (fp_w == NULL){perror("fopen");return; // 防止出现段错误,因为要是文件不存在的话,那就是一个空指针,下面直接操作空指针会出现段错误}while (1){char buff[128] = ""; // 不能定义 *str = ""来存储读取的数据,因为文字常量区的数据是不能被修改的// 将读取到的文件数据存放在数组中char *ret = fgets(buff, sizeof(buff), fp_r);if (ret == NULL){break;}// 将数组中的数据写入到文件某种fputs(buff, fp_w);}fclose(fp_r);fclose(fp_w);
}int main(int argc, char const *argv[])
{test();return 0;
}
读文件的时候要定义一个字符数组接收读出的数据,然后将该字符数组中的数据写入到文字本中
6、一次读写 n 块文件数据
fread 和 fwrite是成对使用的,使用效率高,但是阅读性差
#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
块写:将内存中的数据原样的写入到磁盘文件中,这样操作的速度比较快
块写:将磁盘文件中的数据原样读入到内存中
返回值:实际写入的块数/实际读的块数(整数块数,不足一块不计,但是还是读写了)
ptr :内存空间地址
size:每一块的字节大小
nmemb:总共有多杀块
stream:要写入的是哪个文件
案例:
定义一个结构体
#include <stdio.h>
#include <stdlib.h>
typedef struct
{char name[16];int atk;int def;
} HERO;
定义结构体数组,并且将结构体数组中的数据写入不存在的文件中
void test() // 一次写一个
{HERO hero[] = {{"猴子", 99, 100}, {"八戒", 70, 80}, {"沙僧", 50, 60}};int n = sizeof(hero) / sizeof(hero[0]);FILE *fp = fopen("hero.txt", "w");if (fp == NULL){perror("fopen");return;}fwrite(hero, sizeof(hero), n, fp);fclose(fp);
}
运行生成 hero.txt文件,只不过该文件我们查看不了。因为是将内存中的数据(二进制完全原样写在了文件中)但是不妨碍使用读

#include <string.h>
void read_fun()
{HERO hero[3];memset(hero, 0, sizeof(hero));FILE *fp = fopen("hero.txt", "r");if (fp == NULL){perror("fopen");return;}fread(hero, sizeof(hero), 3, fp);for (int i = 0; i < 3; i++){printf("%s\t%d\t%d\n", hero[i].name, hero[i].atk, hero[i].def);}fclose(fp);
}int main(int argc, char const *argv[])
{read_fun();return 0;
}

7、格式化输出函数
fprintf 和fscanf成对使用,使用效率低,但是便于阅读

解决上面使用fprintf和fscanf造成的无法查看,格式很乱的现象
格式化写fprintf
inline int __cdecl fprintf(FILE *const _Stream, const char *const _Format, ...)
inline int __cdecl fscanf(FILE *const _Stream, const char *const _Format, ...)
FILE *const _Stream:文件指针
void fprintf_fun() // 使用格式化写
{HERO hero[] = {{"猴子", 99, 100}, {"八戒", 70, 80}, {"沙僧", 50, 60}};int n = sizeof(hero) / sizeof(hero[0]);FILE *fp = fopen("hero.txt", "w");if (fp == NULL){perror("fopen");return;}// 一行一行往进去写for (int i = 0; i < n; i++){fprintf(fp, "%s\t%d\t%d\n", hero[i].name, hero[i].atk, hero[i].def); // printf是写入到控制台,fprintf是写入到文件中}fclose(fp);
}

void fscanf_fun() // 使用格式化读
{HERO hero[3];memset(hero, 0, sizeof(hero));FILE *fp = fopen("hero.txt", "r");if (fp == NULL){perror("fopen");return;}for (int i = 0; i < 3; i++){fscanf(fp, "%s\t%d\t%d\n", hero[i].name, &hero[i].atk, &hero[i].def);}for (int i = 0; i < 3; i++){printf("%s\t%d\t%d\n", hero[i].name, hero[i].atk, hero[i].def); // 写到控制台}fclose(fp);
}int main(int argc, char const *argv[])
{fscanf_fun();return 0;
}

8、随机读写
文件默认是顺序读写
但是随机读写的话用户可以更改流指针的位置
相关文章:
c语言操作文件
1、文件缓冲区 文件缓冲区的目的:提高访问效率 提高磁盘使用寿命 刷新就是将当前缓冲区数据全部提交。 不刷新时,程序在崩溃时缓冲区内容无法输出(有些情形会带来错误) 文件缓冲区的四种刷新方式 行刷新(遇到换行符…...
【C语言】初识指针
目录 一、指针是什么 二、指针和指针类型 三、野指针 四、指针运算 五、指针和数组 六、二级指针 七、指针数组 一、指针是什么 指针就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度…...
FFMPEG自学一 音视频解封装
一、音视频包含哪些数据对于一个mp4文件我们可以通过音视频分析软件打开查看内部信息。从两图可以看出mp4文件一般包含 音频流 视频流等。对于上面的字段大致分析如下Format编码方式AVC现在大部分视频都是这种编码方式,即H264。CodecId编码器idavc1H264封装有2种格式…...
HoloLens 2 丨打包丨MRTK丨Unity丨新手教学
HoloLens 2打包流程制作前言开发工具介绍Visual Studio 2019MRTK插件或示例程序下载打包流程介绍Unity操作修改Visual Studio修改Hololens 修改Hololens 密码忘记总结前言 提示:今日功能介绍 使用 MRTK制作hololens 2的打包流程制作的新手教学。 开发工具介绍 这…...
AcWing语法基础课笔记 第四章 C++中的数组
第四章 C中的数组 程序 逻辑 数据,数组是存储数据的强而有力的手段。 ——闫学灿 一维数组 数组的定义 数组的定义方式和变量类似。 数组的初始化 在main函数内部,未初始化的数组中的元素是随机的。 访问数组元素 通过下标访问数…...
UTF小结
运行测试 编辑测试 运行模式:程序集Platform平台选择 Any Platforms编辑模式:程序集Platform平台选择 Editor 特性 Test、UnityTest特性:测试方法需要添加Test或UnityTest特性,测试方法是公有的SetUp、TearDown特性:…...
(考研湖科大教书匠计算机网络)第四章网络层-第六节3:开放最短路径优先OSPF的基本工作原理
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:OSPF概述(1)概述(2)细节阐述A:链路状态和代价B:问候分组和邻居表Cÿ…...
积水在线监测仪——积水点、易涝点水位监测设备
一、设备概述 积水在线监测仪是一款用于城市积水点、易涝点等场景的水位监测设备,设备采用电池供电,无需另外供电,安装方便,使用简单。可以时监测水点、易涝点水位情况,当水位数据超过阈值后触发告警上传,…...
DCMM认证机构
一、什么是DCMM DCMM认证,又称为数据管理能力成熟度评估,依据 都是GB/T -《数据管理能力成熟度评估模型》,这是我国首个数据管理领域的国家标准,由国家质量监督检验检疫总局、国家标准化管理委员会于年3月15日正式发布。DCMM认证…...
Golang基于文件魔数判断文件类型
本文介绍基于魔数判断文件类型,涉及文件查找读取内容、文件魔数、字节比较,最后还介绍函数参数的知识。 查找位置 File.Seek()函数可以设置偏移位置,为下一次读或写确定偏移量,具体起点有whence确定:0标识相对文件开始…...
MySQL——索引视图练习题
学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score)…...
哈希表题目:矩阵置零
文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析解法三思路和算法代码复杂度分析题目 标题和出处 标题:矩阵置零 出处:73. 矩阵置零 难度 3 级 题目描述 要求 给定一个 m…...
HTTP API自动化测试从手工到平台的演变
不管是 Web 系统,还是移动 APP,前后端逻辑的分离设计已经是常态化,相互之间通过 API 调用进行数据交互。在基于 API 约定的开发模式下,如何加速请求 / 响应的 API 测试,让研发人员及早参与到调试中来呢?既然…...
【从零开始学C语言】知识总结一:C语言的基本知识汇总
C语言期末知识点总结 C语言期末试题(附答案)选择题编程题 2022C语言知识点大全【详细、必备】 C语言期末大作业-学生成绩管理系统(完整源码设计报告) C语言期末作业(15个)-货物管理系统、歌曲信息管理系…...
CAD二次开发 添加按钮Ribbon
这篇文章是教大家怎样子创建自己的Ribbon按钮界面(如下图),以下示例代码在CAD2020中运行实现。 背景 创建一个属于自己的Ribbon按钮(如下图) 理解Ribbon、Panel、Tab的关系(如下图)ÿ…...
[RK3568 Android12] 添加自定义启动脚本
1:定义添加的脚本 比如为displayn2k.sh #!/system/bin/sh log "displayn2k.sh begin running" sleep 5 log "displayn2k.sh sleep 8" sleep 5 log "================sleep finished==========================" #remount /system/bin/mount -o …...
API 体系构建
前言 API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。在关键环节制定明确的 API 规范有助于 Service 对内提高产品间互通的效率,对外提供一致的使用体…...
RMPE: Regional Multi-Person Pose Estimation (AlphaPose)阅读笔记
区域多人姿态估计 ICCV 2017 论文链接 代码链接 摘要: 野外多人姿态估计具有挑战性。sota人体检测器不可避免存在定位和识别误差,这些误差可能导致依赖人体检测器的单人姿态估计器(SPPE)的失败。本文提出了一种新的区域多人姿态估…...
2月16日昆明面试经历部分考题
2月16日昆明面试部分考题 1.说说em和rem的区别?rpx呢? rem是相对于根元素(HTML)进行计算,而em是相对于当前元素或父元素的字体大小,如果当前文本的字体尺寸没有设置,则相对于浏览器的默认字体…...
ARC140D One to One
ARC140D One to One 题目大意 对于一个长度为nnn的整数序列X(x1,x2,…xn)X(x_1,x_2,\dots x_n)X(x1,x2,…xn),每个元素都在111到nnn之间,令f(X)f(X)f(X)表示以下问题的答案: 有一个nnn个顶点nnn条边的无向图(可能有重边和…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
