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

新手学习笔记-----⽂件操作

目录

1. 为什么使⽤⽂件?

2. 什么是⽂件?

2.1 程序⽂件

2.2 数据⽂件

2.3 ⽂件名

3. ⼆进制⽂件和⽂本⽂件?

4. ⽂件的打开和关闭

4.1 流和标准流

4.1.1 流

4.1.2 标准流

 4.2 ⽂件指针

4.3 ⽂件的打开和关闭

5. ⽂件的顺序读写

5.1 顺序读写函数介绍

5.1.1 fputc使用举例

1.文件流

2.标准输出流

5.1.2 fgetc使用举例

1.文件流

2. 标准输入流

5.1.3 fputs使用举例

5.1.4 fgets使用举例

5.1.5 fprintf使用举例

1. 文件流

2.标准输出流

5.1.6 fscanf使用举例

5.1.7 fwrite使用举例

5.1.8fread使用举例

5.2 对⽐⼀组函数:

5.2.1 sprintf和sscanf使用举例

6. ⽂件的随机读写

6.1 fseek

1.SEEK_SET

2.SEEK_END

3.SEEK_CUR

6.2 ftell

6.3 rewind

7. ⽂件读取结束的判定

7.1 被错误使⽤的 feof

8. ⽂件缓冲区


1. 为什么使⽤⽂件?

首先,我们使用文件是为了防止数据丢失

一般我们存储数据有2种方式:

1.数据--->内存    退出程序时,数据丢失

2.数据--->硬盘   退出程序时,数据存储在文件中


2. 什么是⽂件?

磁盘上的⽂件是⽂件

⽂件功能的⻆度来分类,一般⽂件有两种:程序⽂件、数据⽂件。

2.1 程序⽂件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。



2.2 数据⽂件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。

一般所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器上

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。



如图,这就是键盘输入--->屏幕显示


如图,这就是对数据文件的简单理解

2.3 ⽂件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤

⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀

注意⚠️

文件后缀可以自己设计,但是要注意一些常用的后缀名

例如: c:\code\test.txt

为了⽅便起⻅,⽂件标识常被称为⽂件名。

3. ⼆进制⽂件和⽂本⽂件?

组织形式的⻆度来分类,一般⽂件有两种:二进制文件,文本文件

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件

⼀个数据在内存中是怎么存储的呢?

字符⼀律以ASCII形式存储数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。

下面我们以10000的存储来举例:


下面我们在VS上测试一个代码试试看:

#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");//⼆进制的形式写到⽂件中fwrite(&a, 4, 1, pf);//将a内存中的1个4个字节的数据写到pf管理文件test.txt中fclose(pf);pf = NULL;return 0;
}

我们发现在生成的文件中打开的看不懂,接下来怎么办?


4. ⽂件的打开和关闭

4.1 流和标准流

4.1.1 流

操作文件顺序:

1.打开文件(流)

2.读/写文件

3.关闭文件

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同为了⽅便程序员对各种设备进⾏⽅便的操作我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是同流操作的

⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作

4.1.2 标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语⾔程序在启动的时候,默认打开了3个流

• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。

• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。

• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

stdin、stdout、stderr三个流的类型是: FILE* ,通常称为⽂件指针。

C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。


 4.2 ⽂件指针

使用文件,打开文件--->打开的同时,创建一个对应的文件信息区--->信息保存在FILE类型的结构变量中

⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便

FILE* pf;//⽂件指针变量

使pf指向某个⽂件的⽂件信息区,通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。


4.3 ⽂件的打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。

ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );//文件名              //打开方式
//关闭⽂件
int fclose ( FILE * stream );


如图,这样我们就方便理解什么是输入什么是输出了。

接下来我们看看mode对应的表:


/* fopen fclose example */
#include <stdio.h>
int main ()
{//打开⽂件FILE * pFile = fopen ("myfile.txt","w");//判断if(pFile==NULL)
{perror("open");return 1;
}//⽂件操作//......//关闭⽂件fclose (pFile);return 0;
}

如果要打开的文件不在代码的路径底下,而是像在桌面的话,怎么办打开桌面的文件呢?

1.绝对路径


2.相对路径(相对于当前路径的位置)


5. ⽂件的顺序读写

5.1 顺序读写函数介绍


5.1.1 fputc使用举例


1.文件流

运行成功


2.标准输出流


5.1.2 fgetc使用举例


1.文件流


2. 标准输入流


5.1.3 fputs使用举例



5.1.4 fgets使用举例



不过,为什么我们不加\n换行呢?又为什么说只能打印(n-1)个数据呢?


5.1.5 fprintf使用举例


1. 文件流


2.标准输出流


5.1.6 fscanf使用举例



5.1.7 fwrite使用举例



但是,由于是二进制的输出我们无法观察,所以,我们尝试以二进制的方式输入读取

5.1.8fread使用举例



5.2 对⽐⼀组函数:

scanf/fscanf/sscanf

printf/fprintf/sprintf

scanf--->针对标准输入流(stdin)的格式化输入函数

printf--->针对标准输出流(stdout)的格式化输出函数

fscanf--->针对所有输入流的格式化输入函数

fprintf--->针对所有输出流的格式化输出函数

sscanf--->从字符串中读取格式化的数据

sprintnf--->把格式化的数据转换成字符串



5.2.1 sprintf和sscanf使用举例


然我们仔细看看:

1.格式化的数据确实转化成字符串存放到arr中了

2.确实从字符串中读取了格式化的数据


6. ⽂件的随机读写

6.1 fseek

根据⽂件指针的位置和偏移量来定位⽂件指针。


例如,我在文件中写abcdefghijk;现在想读取g

1.SEEK_SET


2.SEEK_END


3.SEEK_CUR


6.2 ftell

返回⽂件指针相对于起始位置的偏移量



6.3 rewind

让⽂件指针的位置回到⽂件的起始位置



7. ⽂件读取结束的判定

7.1 被错误使⽤的 feof

牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束

feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

 fgetc 判断是否为 EOF .

• fgets 判断返回值是否为 NULL .

2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数

例如:

• fread(fread返回的是实际读取到的元素个数)判断返回值是否⼩于实际要读的个数。

例如共有14个数据,每次读取4个,

4,4,4,2,

最后一次实际读取的个数小于要求读取的个数

⽂本⽂件的例⼦:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{int c; // 注意:int,⾮char,要求处理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环{ putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);return 0;
}

⼆进制⽂件的例⼦:

#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = {1.,2.,3.,4.,5.};FILE *fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin","rb");size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if(ret_code == SIZE) {puts("Array read successfully, contents: ");for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');}else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);return 0;}

8. ⽂件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。


#include<stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{FILE*pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");Sleep(10000);//单位是毫秒printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}

本次的分享到这里就结束了!!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕

相关文章:

新手学习笔记-----⽂件操作

目录 1. 为什么使⽤⽂件&#xff1f; 2. 什么是⽂件&#xff1f; 2.1 程序⽂件 2.2 数据⽂件 2.3 ⽂件名 3. ⼆进制⽂件和⽂本⽂件&#xff1f; 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 ⽂件指针 4.3 ⽂件的打开和关闭 5. ⽂件的顺序读写 …...

LeetCode 251:展开二维向量

题目 Implement an iterator to flatten a 2d vector. Example: [1,2,3,4,5,6] [1,2,3,4,5,6] Follow up: As an added challenge, try to code it using only iterators in C++ or iterators in Java. 题解: 用两个index 分别记录list 的 index 和当前 list的element index. …...

练[BSidesCF 2020]Had a bad day

[BSidesCF 2020]Had a bad day 文章目录 [BSidesCF 2020]Had a bad day掌握知识解题过程关键paylaod 掌握知识 ​ php伪协议进行文件包含&#xff0c;代码审计&#xff0c;strpos()函数会返回字符串在另一字符串中第一次出现的位置&#xff0c;如果没有找到则返回 FALSE&#…...

第十五章 类和对象——友元

生活中你的家有客厅(Public)&#xff0c;有你的卧室(Private) 客厅所有来的客人都可以进去&#xff0c;但是你的卧室是私有的&#xff0c;也就是说只有你能进去 但是呢&#xff0c;你也可以允许你的好闺蜜好基友进去。 在程序里&#xff0c;有些私有属性 也想让类外特殊的一些…...

【数仓精品理论分析】能不能学大数据?

【数仓精品理论分析】能不能学大数据&#xff1f; 还能不能学大数据datapulse官网&#xff1a; 自身情况数据行业发展情况 还能不能学大数据 首先看到这个话题的时候&#xff0c;我是这样想的&#xff0c;能不能学大数据需要参考本人的自身情况【学历、年龄、决心、有没有矿或者…...

java复习-多态性

多态性 在Java中对于多态性由两种实现的模式&#xff1a; 方法的多态性 方法的重载&#xff1a;同一个方法名称可以根据传入的参数类型和个数的不同&#xff0c;进行不同的处理。 方法的覆写&#xff1a;同一个方法可能根据使用子类的不同&#xff0c;由不同的实现。 对象的…...

美团外卖优惠券小程序 美团优惠券微信小程序 自带流量主模式 带教程

小程序带举牌小人带菜谱流量主模式&#xff0c;挺多外卖小程序的&#xff0c;但是都没有搭建教程 搭建&#xff1a; 1、下载源码&#xff0c;去微信公众平台注册自己的账号 2、解压到桌面 3、打开微信开发者工具添加小程序-把解压的源码添加进去-appid改成自己小程序的 4、…...

编写IDEA插件,实现根据现有代码生成流程图

实现根据现有代码生成流程图的功能需要考虑以下几个步骤&#xff1a; 分析代码结构&#xff0c;获取代码中的变量声明、分支语句、循环语句等语句结构。 根据代码结构生成流程图的节点和边。 将生成的流程图展示在IDEA界面中。 下面逐一说明以上步骤的实现方法&#xff1a;…...

王杰国庆作业day6

服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <my_head.h> #define PORT 2324 //端口号 #define IP "192.168.10.107" //本机IP int main(int argc, const char *argv[]) {sqlite3* d…...

【C语言】循环结构程序设计 (详细讲解)

前言&#xff1a;前面介绍了程序中常常用到的顺序结构和选择结构&#xff0c;但是只有这两种结构是不够的&#xff0c;还有用到循环结构(或者称为重复结构)。因为在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题。 【卫卫卫的代码仓库】 【选择结构】 【专栏链…...

Spring的注解开发-注解原理解析-xml方式/注解方式组件扫描

目录 Spring注解的解析原理 xml配置组件扫描 注解方式配置组件扫描 原理图 yysy&#xff0c;没有搞太明白&#xff0c;真的复杂&#xff0c;欢迎大佬留言解惑 Spring注解的解析原理 使用Component等注解配置完毕后&#xff0c;要配置组件扫描才能使注解生效 xml配置组件扫…...

导出视频里的字幕

导出视频里的字幕 如何利用剪映快速提取并导出视频里的字幕 https://jingyan.baidu.com/article/c35dbcb0881b6fc817fcbcd2.html 如何快速提取视频中的字幕&#xff1f;给大家介绍一种简单高效又免费的提取方法。需要利用到“剪映”&#xff0c;以下是具体的操作步骤和指引&a…...

【KingbaseES】银河麒麟V10 ARM64架构_安装人大金仓数据库KingbaseES_V8R6(CentOS8)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…...

【Vue】Vuex详解,一文读懂并使用Vuex

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…...

第三章 C程序设计

常量与变量 常量&#xff1a;整型常量&#xff1a;如1000 实型常量&#xff1a;十进制小数 字符常量&#xff1a;&#xff1f;&#xff01; 变量&#xff1a;变量必须先定义&#xff0c;后使用。 标识符&#xff1a;一个对象的名字。 浮点型数据 浮点型数据是用来表示具…...

QB/T 2703-2020 汽车装饰用皮革检测

汽车装饰用皮革主要用于坐垫皮革&#xff0c;座椅套皮革&#xff0c;靠垫套皮革&#xff0c;方向盘皮革和其他装饰用皮革&#xff0c;比如仪表盘等&#xff0c;其物理和环保性能非常重要&#xff0c;对人体的健康能起到很大的影响。 QB/T 5754-2022水性/无溶剂聚氨酯复合人造革…...

使用正则表达式批量修改函数

贪心匹配&#xff0c;替换中的$1代表括号中的第一组。 使用[\s\S\r]代表所有字符&#xff0c;同时加个问号代表不贪心匹配:...

【网络协议】UDP

UDP协议与TCP协议都是传输层协议&#xff0c;应用层把数据拷贝到传输层&#xff0c;后续动作由下层自行决定。 UDP协议端格式 16位 UDP 长度 , 表示整个数据报 (UDP 首部 UDP 数据 ) 的最大长度 ;&#xff08;也就是65535字节&#xff09; 如果校验和出错 , 就会直接丢弃 ; …...

雷达编程实战之提高探测速度

有效帧频率作为雷达一个非常核心的指标&#xff0c;它代表了雷达探测识别的速度&#xff0c;速度越快&#xff0c;后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度&#xff0c;提供了一种合理利用片上资源提高探测识别速度的常用方法&#xff0c;然…...

pyspark常用功能记录

前言 pyspark中很多常用的功能&#xff0c;过段时间没有使用就容易忘记&#xff0c;需要去网上搜索&#xff0c;这里总结一下&#xff0c;省的以后还去去搜&#xff0c;供自己以后参考。 withColumn def hot_func(info_str):if info_str:eturn "1"return "0&…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...