两小时让你全方位的认识文件(一)

news/2024/11/29 12:39:57/

想必友友们在生活中经常会使用到各种各样的文件,那么我们是否了解它其中的奥秘呢,今天阿博就带领友友们深入地走入文件🛩️🛩️🛩️

文章目录

    • 一.为什么使用文件
    • 二.什么是文件
    • 三.文件的打开和关闭
    • 四.文件的顺序读写

一.为什么使用文件

二.什么是文件

三.文件的打开和关闭

四.文件的顺序读写

一.为什么使用文件

我们在生活中会应用到一些信息,应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

二.什么是文件

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
1.程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
2.数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
3.文件名:文件名包含3部分:文件路径+文件名主干+文件后缀,例如: c:\code\test.txt,这c:\code\就是文件路径test就是文件名主干.txt就是文件后缀

这里阿博在画图给友友们直观看一下它们的联系
在这里插入图片描述

三.文件的打开和关闭

首先给友友们介绍一下文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件.

图解分析
在这里插入图片描述
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这里阿博给友友们总结一些比较常见的文件打开方式👀👀
在这里插入图片描述
代码解析

int main()
{FILE* pf = fopen("text.txt", "w");//FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}fclose(pf);pf = NULL;return  0;
}

在这里插入图片描述

看吧,友友们,产生了一个新的文件,如果我们这里把这个文件删除,再用“r”的形式打开,让我们看看效果吧👻👻

在这里插入图片描述

这就是打开方式“r”和“w”的区别

刚才是相对路径下的文件,如果我们想打开桌面上的文件该如何处理呢

首先友友们用鼠标右击这个文件,找到属性,就能看到它的路径了

在这里插入图片描述

代码解析

int main()
{//FILE* pf = fopen("C:\Users\86166\Desktop.txt", "r");FILE* pf = fopen("C:\\Users\\86166\\Desktop.txt", "w");if (pf == NULL){perror("fopen");return;}fclose(pf);pf = NULL;return  0;
}

因为\t是转义字符,所以我们在加上一个斜杠,斜杠转义斜杠,这样它就是一个正常的斜杠了

在这里插入图片描述

在这里插入图片描述

所以友友们我们可以得出一个结论,如果文件里面有内容的话,当以“w”的形式打开时,它会把文件里面的内容销毁掉,创建一个新的文件

四.文件的顺序读写

又到了传授内功的环节了🥷🥷
在这里插入图片描述

fputc的功能
在这里插入图片描述
代码解析

int  main()
{FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");return;}//读文件//把26个英文字母写到文件中int  i = 0;for (i = 0; i < 26; i++){fputc('a'+i, pf);}fclose(pf);pf = NULL;return  0;
}

在这里插入图片描述

友友们,这就是写文件操作,让我们见识一下读文件操作吧

fgetc的功能
在这里插入图片描述

代码解析

int  main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}int  ch = 0;for (int i = 0; i < 26; i++){ch = fgetc(pf);printf("%c ", ch);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

疑惑解析
在这里插入图片描述
fputs的功能
在这里插入图片描述

代码解析

int  main()
{FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");return;}fputs("i love you", pf);fclose(pf);pf = NULL;return  0;
}

在这里插入图片描述

友友们,这就是写一行数据,下面让我们测试一下读一行数据吧

fgets的功能
在这里插入图片描述

代码解析

int  main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}char arr[20] = { 0 };fgets(arr,10, pf);printf("%s\n", arr);fclose(pf);pf = NULL;return  0;
}

在这里插入图片描述

注意了友友们,这里虽然我们让它读10个字符,但实际上最多读9个,因为它最后一个位置需要放\0

fprintf的功能

在这里插入图片描述

代码解析

#include<stdio.h>
struct S
{int n;float f;char arr[20];
};
int  main()
{struct S s = { 100,3.14f,"zhangsan" };FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");return;}fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);fclose(pf);pf = NULL;return  0;
}

在这里插入图片描述

友友们,这就是我们的写文件操作,接下来我们来看看读文件操作

fscanf的功能

在这里插入图片描述

代码解析

struct S
{int n;float f;char arr[20];
};
int  main()
{struct S s = {0};FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}fscanf(pf, "%d %f %s\n", &(s.n),&(s.f), s.arr);printf("%d %f %s", s.n, s.f, s.arr);fclose(pf);pf = NULL;return  0;
}

在这里插入图片描述

友友们,这里阿博给大家总结一下流的类型和概念😊😊

在这里插入图片描述

sprintf的功能
在这里插入图片描述

功能:把一个格式化的数据写到字符串中(把一个格式化的数据转换成字符串)

sscanf的功能
在这里插入图片描述

功能:把一个字符串转换成对应的格式化数据

代码解析

struct S
{int n;float f;char arr[20];
};
int  main()
{struct S s = { 200,3.5f,"wangwu" };//把一个结构体转换成字符串char arr[200] = { 0 };sprintf(arr, "%d %f %s\n", s.n, s.f, s.arr);printf("字符串的数据:%s\n", arr);struct  S temp = { 0 };sscanf(arr, "%d %f %s\n", &(temp.n) ,&(temp.f), temp.arr);printf("格式化的数据:%d %f %s\n", temp.n, temp.f, temp.arr);return  0;
}

在这里插入图片描述
这里阿博给友友们总结一下

scanf–>针对标准输入流(stdin)的格式化的输入函数
printf–>针对标准输出流(stdout)的格式化的输出函数

fscanf–>针对所有输入流(文件流/stdin)的格式化的输入函数
fprintf–>针对所有输出流(文件流/stdout)的格式化的输出函数

sscanf–>把字符串转换成格式化的数据
sprintf–>把格式化的数据转换成字符串

好了友友们,本期内容讲到这里就结束了,下期阿博会完结文件知识,码字不易,可以给阿博点个关注哦,让我们下期再见💐💐💐

http://www.ppmy.cn/news/61612.html

相关文章

Spring Bean的作用域

在Spring中&#xff0c;bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。 目前Spring Bean的作用域或者说范围主要有五种。 作用域描述singleton在spring IoC容器仅存在一个Bean实例&#xff0c;Bean以单例方式存在&#xff0c;bean作用域范围的默认值…

【51单片机】使用STC烧录软件生成定时器的代码以及注意事项

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 1.点击定时器计算器​编辑 2.每次打开的时…

宏观经济笔记--社会消费品零售总额

我们讨论了GDP的三个分项&#xff1a;投资、消费、净出口。投资我们前面已经介绍了&#xff0c;消费这一个分项我们还一直没有讨论。消费最重要的数据是每个月月中统计局公布的社会消费品零售总额。 一般的论调中&#xff0c;认为消费是三个GDP驱动项中最健康的一项&#xff0…

轻松掌握!Pandas的数据添加技巧,3秒学会更高效的方法

在Pandas中&#xff0c;如果你想高效地向一个DataFrame添加一行数据&#xff0c;千万不要使用.append()方法&#xff01;因为这种方法需要创建新的对象然后再赋值&#xff0c;效率较低&#xff0c;尤其是DataFrame较大时。 本文将介绍3种Pandas添加一行数据更高效的方法&#x…

每天一道算法练习题--Day25 第一章 --算法专题 --- ----------蓄水池抽样

蓄水池抽样 问题描述算法描述相关题目总结 力扣中关于蓄水池抽样问题官方标签是 2 道&#xff0c;根据我的做题情况来看&#xff0c;可能有三四道。比重算是比较低的&#xff0c;大家可以根据自己的实际情况选择性掌握。 蓄水池抽样的算法思维很巧妙&#xff0c;代码简单且容易…

【LLM】低成本部署大语言模型, 并且还能达到部署在GPU上差不多的效果

目录 前言 部署 效果 问题1&#xff1a;人类为什么需要睡觉&#xff1f; 问题2&#xff1a;世界上最高的山峰是什么&#xff1f; 前言 点进来看本文的应该都知道模型对硬件的要求很高, 那我也不废话了, 直接安排最近发现的一个开源项目, 它可以帮助我们降低部署模型的成…

SpringMVC详细介绍和@RequestMapping详细使用说明

目录 SpringMVC SpringMVC 介绍 说明是 MVC MVC 全称∶ Model 模型、View 视图、 Controller 控制器。 MVC 是一种思想 MVC 示意图 理解和解读 SpringMVC 特点&概述 梳理 Spring SpringMVC SpringBoot 的关系 SpringMVC-快速入门 SpringMVC 登录流程分析 SpringM…

人工智能洗稿-免费自媒体洗稿工具

文字洗稿 文字洗稿是指通过修改、重组、删除、替换等手段对文本进行优化、清理和调整&#xff0c;以达到改善文章质量、增加独特性和提高可读性的目的。文字洗稿是自媒体行业的一个重要需求&#xff0c;尤其是在批量撰写文章或需要大量修改文本的情况下。文字洗稿分为自动洗稿…