当前位置: 首页 > news >正文

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、文件缓冲区 文件缓冲区的目的&#xff1a;提高访问效率 提高磁盘使用寿命 刷新就是将当前缓冲区数据全部提交。 不刷新时&#xff0c;程序在崩溃时缓冲区内容无法输出&#xff08;有些情形会带来错误&#xff09; 文件缓冲区的四种刷新方式 行刷新&#xff08;遇到换行符…...

【C语言】初识指针

目录 一、指针是什么 二、指针和指针类型 三、野指针 四、指针运算 五、指针和数组 六、二级指针 七、指针数组 一、指针是什么 指针就是内存地址&#xff0c;指针变量是用来存放内存地址的变量&#xff0c;在同一CPU构架下&#xff0c;不同类型的指针变量所占用的存储单元长度…...

FFMPEG自学一 音视频解封装

一、音视频包含哪些数据对于一个mp4文件我们可以通过音视频分析软件打开查看内部信息。从两图可以看出mp4文件一般包含 音频流 视频流等。对于上面的字段大致分析如下Format编码方式AVC现在大部分视频都是这种编码方式&#xff0c;即H264。CodecId编码器idavc1H264封装有2种格式…...

HoloLens 2 丨打包丨MRTK丨Unity丨新手教学

HoloLens 2打包流程制作前言开发工具介绍Visual Studio 2019MRTK插件或示例程序下载打包流程介绍Unity操作修改Visual Studio修改Hololens 修改Hololens 密码忘记总结前言 提示&#xff1a;今日功能介绍 使用 MRTK制作hololens 2的打包流程制作的新手教学。 开发工具介绍 这…...

AcWing语法基础课笔记 第四章 C++中的数组

第四章 C中的数组 程序 逻辑 数据&#xff0c;数组是存储数据的强而有力的手段。 ——闫学灿 一维数组 数组的定义 数组的定义方式和变量类似。 数组的初始化 在main函数内部&#xff0c;未初始化的数组中的元素是随机的。 访问数组元素 通过下标访问数…...

UTF小结

运行测试 编辑测试 运行模式&#xff1a;程序集Platform平台选择 Any Platforms编辑模式&#xff1a;程序集Platform平台选择 Editor 特性 Test、UnityTest特性&#xff1a;测试方法需要添加Test或UnityTest特性&#xff0c;测试方法是公有的SetUp、TearDown特性&#xff1a…...

(考研湖科大教书匠计算机网络)第四章网络层-第六节3:开放最短路径优先OSPF的基本工作原理

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;OSPF概述&#xff08;1&#xff09;概述&#xff08;2&#xff09;细节阐述A&#xff1a;链路状态和代价B&#xff1a;问候分组和邻居表C&#xff…...

积水在线监测仪——积水点、易涝点水位监测设备

一、设备概述 积水在线监测仪是一款用于城市积水点、易涝点等场景的水位监测设备&#xff0c;设备采用电池供电&#xff0c;无需另外供电&#xff0c;安装方便&#xff0c;使用简单。可以时监测水点、易涝点水位情况&#xff0c;当水位数据超过阈值后触发告警上传&#xff0c;…...

DCMM认证机构

一、什么是DCMM DCMM认证&#xff0c;又称为数据管理能力成熟度评估&#xff0c;依据 都是GB/T -《数据管理能力成熟度评估模型》&#xff0c;这是我国首个数据管理领域的国家标准&#xff0c;由国家质量监督检验检疫总局、国家标准化管理委员会于年3月15日正式发布。DCMM认证…...

Golang基于文件魔数判断文件类型

本文介绍基于魔数判断文件类型&#xff0c;涉及文件查找读取内容、文件魔数、字节比较&#xff0c;最后还介绍函数参数的知识。 查找位置 File.Seek()函数可以设置偏移位置&#xff0c;为下一次读或写确定偏移量&#xff0c;具体起点有whence确定&#xff1a;0标识相对文件开始…...

MySQL——索引视图练习题

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…...

哈希表题目:矩阵置零

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析解法三思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;矩阵置零 出处&#xff1a;73. 矩阵置零 难度 3 级 题目描述 要求 给定一个 m…...

HTTP API自动化测试从手工到平台的演变

不管是 Web 系统&#xff0c;还是移动 APP&#xff0c;前后端逻辑的分离设计已经是常态化&#xff0c;相互之间通过 API 调用进行数据交互。在基于 API 约定的开发模式下&#xff0c;如何加速请求 / 响应的 API 测试&#xff0c;让研发人员及早参与到调试中来呢&#xff1f;既然…...

【从零开始学C语言】知识总结一:C语言的基本知识汇总

C语言期末知识点总结 C语言期末试题&#xff08;附答案&#xff09;选择题编程题 2022C语言知识点大全【详细、必备】 C语言期末大作业-学生成绩管理系统&#xff08;完整源码设计报告&#xff09; C语言期末作业&#xff08;15个&#xff09;-货物管理系统、歌曲信息管理系…...

CAD二次开发 添加按钮Ribbon

这篇文章是教大家怎样子创建自己的Ribbon按钮界面&#xff08;如下图&#xff09;&#xff0c;以下示例代码在CAD2020中运行实现。 背景 创建一个属于自己的Ribbon按钮&#xff08;如下图&#xff09; 理解Ribbon、Panel、Tab的关系&#xff08;如下图&#xff09;&#xff…...

[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 设计&#xff0c;而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。在关键环节制定明确的 API 规范有助于 Service 对内提高产品间互通的效率&#xff0c;对外提供一致的使用体…...

RMPE: Regional Multi-Person Pose Estimation (AlphaPose)阅读笔记

区域多人姿态估计 ICCV 2017 论文链接 代码链接 摘要&#xff1a; 野外多人姿态估计具有挑战性。sota人体检测器不可避免存在定位和识别误差&#xff0c;这些误差可能导致依赖人体检测器的单人姿态估计器&#xff08;SPPE&#xff09;的失败。本文提出了一种新的区域多人姿态估…...

2月16日昆明面试经历部分考题

2月16日昆明面试部分考题 1.说说em和rem的区别&#xff1f;rpx呢&#xff1f; rem是相对于根元素&#xff08;HTML&#xff09;进行计算&#xff0c;而em是相对于当前元素或父元素的字体大小&#xff0c;如果当前文本的字体尺寸没有设置&#xff0c;则相对于浏览器的默认字体…...

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​)&#xff0c;每个元素都在111到nnn之间&#xff0c;令f(X)f(X)f(X)表示以下问题的答案&#xff1a; 有一个nnn个顶点nnn条边的无向图&#xff08;可能有重边和…...

联合身份验证与Cognito

Hello大家好&#xff0c;我们接下来讨论AWS联合身份验证的内容。 AWS联合身份验证 对于考试&#xff0c;联合身份验证部分是一块非常重要的内容。那什么是联合身份验证&#xff0c;它是做什么用的呢&#xff1f; 联合身份验证&#xff0c;是用来允许AWS外部用户&#xff0c;如…...

day18_常用API之String类丶Object类

String概述 java.lang.String 类代表字符串&#xff0c;String类定义的变量可以用于指向字符串对象&#xff0c;同时String类提供了很多操作字符串的功能&#xff0c;我们可以直接使用。Java 程序中的所有字符串文字&#xff08;例如“abc”&#xff09;都为此类的对象 特点:St…...

OSG三维渲染引擎编程学习之五十五:“第五章:OSG场景渲染” 之 “5.13 一维纹理”

目录 第五章 OSG场景渲染 5.13 一维纹理 5.13.1 一维纹理介绍 5.13.2 一维纹理示例 第五章 OSG场景渲染 OSG存在场景树和渲染树,“场景数”的构建在第三章“OSG场景组织”已详细阐明,本章开始...

RTOS随笔之FreeRTOS启动与同步方法

RTOS启动与同步机制RTOS启动任务切换场景任务同步机制队列信号量事件组任务通知任务延时RTOS启动 FreeRTOS在任务创建完成后调用函数vTaskStartScheduler()启动任务调度器。 vTaskStartScheduler()任务启动函数详解 void vTaskStartScheduler( void ) {BaseType_t xReturn;xR…...

【AI/NLP】InstructGPT数据标注问题

文章目录1 背景介绍2 标记员筛选2.1 标记员筛选标准3 数据集及其标注3.1 预训练3.2 微调3.2.1 SFT-demonstration data3.2.2 RM-comparison data3.3 数据集大小4 模型实现1 背景介绍 ChatGPT的训练过程与InstructGPT相近&#xff0c;大致分为三步&#xff1a; SFT&#xff1a…...

三次握手和四次挥手

文章目录TCP三次握手为什么要三次握手三次握手可以携带数据吗&#xff1f;三次握手失败&#xff0c;服务端会如何处理?ISN代表什么&#xff0c;意义&#xff0c;何要动态随机什么是半连接队列第2次握手传回了ACK&#xff0c;为什么还要传回SYN&#xff1f;为什么要四次挥手TCP…...

Jmeter常用断言之响应断言详解

响应断言是最常用的一种断言方法&#xff0c;主要是对响应结果中的文本内容进行断言&#xff0c;比如响应结果是否包含指定的值&#xff0c;或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果&#xff0c;如&#xff1a;Test、html、application/json、applicatio…...

【Python学习笔记】36.Python3 MySQL - mysql-connector 驱动(1)

前言 MySQL 是最流行的关系型数据库管理系统&#xff0c;本章节为大家介绍使用 mysql-connector 来连接使用 MySQL&#xff0c; mysql-connector 是 MySQL 官方提供的驱动器。 Python3 MySQL - mysql-connector 驱动 我们可以使用 pip 命令来安装 mysql-connector&#xff1…...

计算机SCI论文课题设计需要注意什么? - 易智编译EaseEditing

课题设计就要本着严谨性和可行性来进行。实验设计的类型要选择准确&#xff0c;统计学的方法要运用合理&#xff0c;研究对象和观察指标的选择也要符合研究目的的要求&#xff0c;技术路线要清晰明了。 关于课题的设计的可行性也要综合考虑&#xff0c;比如前期的相关工作基础…...

Quartz入门教程

本文参考文章编写 Quartz 官网 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目&#xff0c;是完全由 Java 开发的一个开源任务日程管理系统&#xff0c;“任务进度管理器”就是一个在预先确定&#xff08;被纳入日程&#xff09;的时间到达时&#xff…...

外国网站签到做任务每月挣钱/深圳最好的外贸seo培训

层叠样式 表和动态HTML层叠样式表(CSS)是指定HTML文档或XML文档的表现的标准。使用CSS和Javascript&#xff0c;可以创建出各种视觉效果&#xff0c;这些效果可以统称为动态HTML(DHTML)CSS样式是一个名称/值的属性列表指定的&#xff0c;属性之间用分号隔开&#xff0c;名字属性…...

深圳做企业网站的公司推荐/自己的网站

说明&#xff1a;之前在CentOS7下配置过bridge&#xff0c;现在讲bridge模式改为普通模式后&#xff0c;查看网卡的时候还是可以看到很多垃圾信息&#xff0c;想彻底删除自己不想要的网卡配置信息&#xff0c;操作如下:[rootlinux-node1 ~]# ip add list 1: lo: <LOOPBACK,U…...

在深圳学网站设计/chrome浏览器下载安卓手机

工作的原因&#xff0c;本人经常在高速上开车&#xff0c;发现此文很好&#xff0c;特粘贴给经常开车的朋友们&#xff01;来自一个高速交警的忠告&#xff0c;非常重要强烈推荐随着道路上的私家车越来越多&#xff0c;作为一名高速交警&#xff0c;在日常的事故处理岗位上&…...

加载其他网站图片seo/软文广告怎么写

第一步&#xff1a;下載微信支付sdk下載網址&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1這是微信支付商戶平台頁面“公眾號支付”模塊里面的sdk&#xff0c;app支付的sdk是不能用的。下載好sdk之后&#xff0c;真正需要的文件有5個&#xff0c…...

.net网站制作/廊坊网站建设公司

1LRC电路 有一个LRC电路连接电容电感如上&#xff0c;电压VV0Cos(ωt)VV_{0}Cos(\omega t)VV0​Cos(ωt) 以此建立方程 VCIR−V0Cos(ωt)−LdIdtV_{C}IR-V_{0}Cos(\omega t)-L\frac{dI}{dt} VC​IR−V0​Cos(ωt)−LdtdI​ IdQdtI\frac{dQ}{dt} IdtdQ​ VCQCV_{C}\frac{Q}{C} V…...

做国内第一游戏数据门户网站/国内设计公司前十名

问题描述所以我想知道哪一个是我的OpenGL版本。我可以通过SSH访问Ubuntu。我应该执行哪个命令&#xff1f;最佳解决办法检查OpenGL版本&#xff0c;glxinfo | grep "OpenGL version"你会得到如下输出&#xff0c;glxinfo | grep "OpenGL version"OpenGL ve…...