C语言 | 文件操作(上)【必收藏】

文件操作(上)

  • 1、使用文件的原因
  • 2、什么是文件
  • 3、二进制文件和文本文件
  • 4、 流的打开与关闭
    • 4.1 流和标准流
      • 4.1.1 流
      • 4.1.2 标准流
    • 4.2 文件指针
    • 4.3 文件的打开和关闭
  • 5、文件的顺序读写
    • 5.1 顺序读写函数介绍
      • 5.1.1 fputc与fgetc

1、使用文件的原因

首先来看一个代码:

int main()
{int a = 0;printf("a = %d\n", a);scanf("%d", &a);printf("a = %d\n", a);return 0;
}

当我们输入一个100,代码的运行结果是:
在这里插入图片描述
可以看到,a变成了100,那么我们关闭程序,再次运行程序a还会是100吗?
在这里插入图片描述
a又变为0,这是为什么呢?
原因是: a是在内存上的一块空间,如果程序退出,内存会归还给操作系统,a中的数据就会丢失,所以第二次运行程序时是看不到上一次的数据的,如果我们想要持久化的保存数据,我们可以将数据保存在硬盘上的文件中。

2、什么是文件

磁盘(硬盘)上的文件就是文件
我们一般所说的文件有两种,一种是程序文件,一种是数据文件
程序文件: 源程序文件(后缀为.c),目标文件(Windows环境下的目标文件后缀为.obj),可执行程序(Windows环境下的目标文件后缀为.exe)
数据文件: 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
在这里插入图片描述
文件名: 文件路径+文件名主干+文件后缀
例如:c:\code\test.txt
在这里插入图片描述

3、二进制文件和文本文件

根据文件的内容可以将文件划分为二进制文件文本文件
数据是以二进制的补码存储在内存中的,如果不加转换的输出到外存的文件中去,就叫做二进制文件
如果在存储前将数据转换成ASCII值的形式存储到外存中,以ASCII码字符存储的文件就叫做文本文件
举个例子,将 10000 存储到文件中,以二进制形式输出到硬盘上占4个字节,而以ASCII值形式输出则占用5个字节
在这里插入图片描述
代码:

int main()
{int a = 10000;FILE* p = fopen("data.txt", "wb");//w是写,b是以二进制的形式fwrite(&a, 4, 1, p);fclose(p);p = NULL;return 0;
}

结果是一个看不懂的二进制文件
在这里插入图片描述
如果在VS上打开:
在这里插入图片描述
在这里插入图片描述
可以看到存储的是 10 27 00 00,,就是10000
在这里插入图片描述

4、 流的打开与关闭

4.1 流和标准流

4.1.1 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

4.1.2 标准流

问题: 在使用C语言写程序时,使用scanf从键盘输入数据或者使用printf向屏幕输出数据为什么没有打开流和关闭流的操作呢?

原因就是C语言程序在启动的时候,默认打开了3个流:
stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出 流中。
stderr - 标准错误流,大多数环境中输出到显示器界面。 这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针。
在C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

4.2 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,如文件的名字,文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

在这里插入图片描述

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

文件是在硬盘上的,文件信息区是在内存上的!

4.3 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSI C 规定使用 fopen 函数来打开文件,fclose 来关闭文件。

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//                  文件名               文件的打开方式

返回的就是FILE*的指针,就是文件信息区的地址,然后就能找到文件信息区,就能找到流,然后进行读写操作

//关闭文件
int fclose ( FILE * stream );

mode表示文件的打开模式,下面都是文件的打开模式:
在这里插入图片描述

代码:

int main()
{//打开文件//打开成功返回有效的文件指针//打开失败返回NULLFILE* pf = fopen("data.txt", "w");//只写if (pf == NULL){perror("fopen");return 1;}//写文件//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
若文件路径下没有data.txt的文件,在只写的情况下,会自动在文件路径下创建一个data.txt文件,然后可以进行文件的写操作

若文件路径下有data.txt文件,并且文件中有内容,在只写的情况下会清空文件中的内容

执行程序前:
在这里插入图片描述
执行程序后:
在这里插入图片描述

代码:举例“w”和“r”

int main()
{//打开文件//打开成功返回有效的文件指针//打开失败返回NULLFILE* pf = fopen("test.txt", "r");//只读if (pf == NULL){perror("fopen");return 1;}//读文件//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
文件路径下没有test.txt文件,只读的话会报错
在这里插入图片描述
假如文件现在不在当前程序的路径下,在桌面该怎么打开?

我们就需要再在文件名之前添加文件的路径,如果能找到该文件,则文件内容会被清空
在这里插入图片描述
代码:

int main()
{//打开文件//打开成功返回有效的文件指针//打开失败返回NULLFILE* pf = fopen("C:\\Users\\Administrator\\Desktop\\test.txt", "w");//只写//                这也叫做绝对路径if (pf == NULL){perror("fopen");return 1;}//写文件//关闭文件fclose(pf);pf = NULL;return 0;
}

若文件在该工程所在路径的上一级路径该怎么办?
在这里插入图片描述

int main()
{//打开文件//打开成功返回有效的文件指针//打开失败返回NULLFILE* pf = fopen(".\\..\\test.txt", "w");//这叫做相对路径//. 表示当前路径//.. 表示上一级路径if (pf == NULL){perror("fopen");return 1;}//写文件//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
文件被清空,说明文件操作成功!

5、文件的顺序读写

5.1 顺序读写函数介绍

在这里插入图片描述

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);
所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

5.1.1 fputc与fgetc

fputc:

int fputc ( int character, FILE * stream );
//            输入的内容      文件指针

代码:

int main()
{//打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件for (int i = 'a'; i <= 'z'; i++){fputc(i, pf);//  内容  文件指针}//关闭文件fclose(pf);pf = NULL;return 0;
}

程序执行结果:项文件中写入26个英文字母
在这里插入图片描述

fgetc:

int fgetc ( FILE * stream );
//            文件指针

若文件读取成功,返回字符的ASCII值;
若文件读取失败,返回EOF(文件结束标志);

int main()
{//打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//写文件int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

程序执行结果:
在这里插入图片描述

以上就是上篇的全部内容啦!下篇更精彩哦!希望大家多多点赞支持!
如果有什么问题,欢迎私信!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 614 (Div. 1) B. Aroma‘s Search

Aroma’s Search time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output With a new body, our idol Aroma White (or should we call her Kaori Minamiya?) begins to uncover her lost past through the OS s…

人工智能在肿瘤细胞分类中的应用|顶刊速递·24-06-06

小罗碎碎念 推文主题——人工智能在肿瘤细胞分类中的应用。 重点关注 临床方向的同学/老师建议重点关注第四篇&第六篇文章&#xff0c;最近DNA甲基化和蛋白组学与AI的结合&#xff0c;在顶刊中出现的频率很高&#xff0c;建议思考一下能否和自己的课题结合。 工科的同学重…

LeetCode题练习与总结:验证回文串--125

一、题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xf…

入职一周感慨

上周太忙了&#xff0c;去打了个球&#xff0c;买了个二手电动车&#xff0c;然后按了个spa。所以忘记吾日三省吾身了&#xff0c;罪孽呀。 本来事情都很顺利的&#xff0c;昨天在工作上&#xff0c;我不小心把cdh集群的主节点ntp remove了&#xff0c;然后重启了所有服务&…

【永久使用】Xshell7+Xftp7免费版安装教程

Xshell7是用来连接linux服务器的软件。 Xftp7是和linux服务器进行文件操作的软件&#xff08;可新增&#xff0c;删除服务器上的文件&#xff09;&#xff0c;可嵌入在Xshell7中运行。 如何安装 先下载安装文件&#xff08;免费获取&#xff09; https://gitee.com/hadluo/…

网格重构技术在AI绘画中的革新作用

引言&#xff1a; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;艺术创作也迎来了前所未有的变革。AI绘画不仅改变了艺术家的创作方式&#xff0c;还为非专业人士开启了艺术创作的大门。在众多AI技术中&#xff0c;网格重构技术因其独特的作用和效果成为A…

JS实现文字溢出隐藏效果

需求场景 由于项目原因&#xff0c;经常需要使用到canvas来将dom生成为图片供用户保存&#xff0c;但canvas的css属性&#xff08;例如本文实现的文字溢出隐藏效果&#xff09;支持并不全面&#xff0c;所有有些功能只能用JS来实现了 实现思路 用JS循环判断填充文本后的元素…

为什么选择Symfony框架?深入解析PHP框架

目录 1. Symfony框架概述 1.1 什么是Symfony? 1.2 Symfony的历史 2. Symfony的核心特性 2.1 MVC架构 2.2 可重用的组件 2.3 Bundle系统 2.4 高度可配置性 2.5 强大的调试工具 3. 为什么选择Symfony框架? 3.1 性能与可扩展性 3.2 企业级应用的首选 3.3 活跃的社区…

Python NumPy 库详解

大家好&#xff0c;在当今数据驱动的世界中&#xff0c;处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中&#xff0c;NumPy&#xff08;Numerical Python&#xff09;库是一款备受推崇的工具&#xff0c;它为我们提供了高…

PHP调用快递地址解析接口助力项目优化

快递地址智能解析是日常开发中一个重要的工具&#xff0c;可以帮助快递公司提高效率&#xff0c;减少错误&#xff0c;进行数据分析。也可以帮助网购用户快速输入收货地址&#xff0c;提升用户体验。 看完以下操作文档&#xff0c;可以让你在开发中以最快时间完成这个功能&…

mybatis 之 DatabaseIdProvider 教程

mybatis之DatabaseIdProvider 应用中可能同时涉及到多个数据库&#xff0c;比如MySQL&#xff0c;oracle等等&#xff0c;那么当我们使用mybatis的时候&#xff0c;怎么做到动态切换呢&#xff1f;DatabaseIdProvider 可以帮助我们 public interface DatabaseIdProvider {def…

取消el-time-picker组件在Sarari浏览器中下拉回弹效果

在项目中用到el-time-picker组件来选择时间&#xff0c; 但是在Safari浏览器中&#xff0c;滑动分钟列表时&#xff0c;会取消时钟的选择&#xff0c;这是因为滑动分钟列表时有一个回弹效果&#xff0c;回弹把时钟的选择给取消掉了&#xff0c;我们现在要做的就是取消滑动时钟时…

谷歌配置邮箱stmp开发

谷歌的stmp开发&#xff0c;需要一个专用密码 首先要打开二部验证 然后再通过这个链接&#xff0c;创建专用密码 https://myaccount.google.com/u/6/apppasswords?gar1 然后拿专用密码去写在代码上&#xff0c;谷歌发邮件&#xff0c;不知道是不是国内还是什么原因&#xff…

Java-开发技巧

1.判断list或者map 用org.apache.commons.collections4包下的 CollectionUtils.isNotEmpty 2.判断字符串 用org.apache.commons.lang3包下的 StringUtils 3.执行分组操作&#xff0c;List<StatusDAO>不会为null情况 Map<LocalDateTime,List<StatusDAO>> …

Centos上部署Node服务和MongoDB

文章目录 1.Centos上安装运行Node服务1. 安装Node.js2.验证Node.js安装3.运行Node.js应用程序4.调试Node.js应用 2.Centos上安装MongoDB3.创建Node服务1.配置初始化文件2.创建index.js文件3.启动服务3.配置公网访问forever的引入pm2的引入 4.应对CORS跨域使用cors中间件手动设置…

深入理解MySQL分区技术

前言&#xff1a; 在数据量不断增长的当今时代&#xff0c;数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统&#xff0c;提供了多种性能优化手段&#xff0c;其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

《大道平渊》· 拾叁 —— 失眠?忍不住乱想?不如反其道而行之!

《平渊》 拾叁 "睡觉的时候就是要胡思乱想" 声明&#xff1a;以下内容针对非失眠症人群&#xff0c;如果失眠不是偶尔发生&#xff0c;而是长期存在&#xff0c;以下内容和你无关&#xff0c;请尽早治疗&#xff0c;遵循医嘱。 失眠的本质是什么&#xff1f;心理因素…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

Qt实现信号与槽,模拟Qt的信号与槽,观察者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下 33. Qt信号与槽 实现原理&#xff1a;观察者模式&#xff0c;即当一个对象被修改时&#xff0c;就会自动通知依赖它的对象。应用&#xff1a;对象间的通信。 33.1. Qt实现信号与槽&#xff0c;代码如下。 #include <QOb…

电脑撤回的快捷键是什么?

下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍&#xff0c;在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”&#xff0c;用于取消上一步操作&#xff0c;对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…