C语言【文件操作 1】

文章目录

  • 1.为什么使用文件
  • 2.文件是什么?
    • 2.1程序文件
    • 2.2数据文件
  • 3.二进制文件和文本文件
  • 4.文件的打开和关闭
    • 4.1流和标准流
      • 标准流
    • 4.2文件指针
    • 4.3文件的打开和关闭
  • 结语

1.为什么使用文件

很简单 长久的存储数据

如果没有文件,我们写程序所产生的数据是存储在电脑的内存中的,一但程序结束或退出,内存就会回收,数据就丢失了,等我们再次运行程序的时候,是找不到上次程序产生的数据的,如果末尾想要将数据进行长期的保存,那就可以使用文件。

2.文件是什么?

磁盘(硬盘)上的文件就是文件。
但是在程序设计中,我们说的文件有两种:程序文件、数据文件(是从文件功能的角度来分类的)。

2.1程序文件

程序文件包含源程序文件(xxx.c),目标文件(在Windows环境下为xxx.obj),可执行程序(在Windows环境下为xxx.exe).

2.2数据文件

该类型文件的内容就不是程序,而是程序运行时所存入的数据,例如程序运行需要读取数据的文件,或输出产生并输出内容的文件。

该文章讨论的是数据函数

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

根据数据的存储模式,数据文件由分为文本文件二进制文件

数据是以二进制的形式在存储在内存中的,如果不转换的输出或者存储在文件中,就是二进制文件

如果在输出上要求以ASCII码的形式存储,则需要在存储前进行转换。以ASCII字符的形式存储文件就是文件文件

那么一个数据是怎么存储在文件上的呢?

字符一律按照ASCII码的形式存储,数值形式的数据既可以用ASCII码形式存储,也可以用二进制的形式存储。

假设有个整数10000,如果以ASCII码的形式存储,就会占用磁盘中的5个字节,如果是以二进制存储,则只占用磁盘中的4个字节。
在这里插入图片描述

4.文件的打开和关闭

4.1流和标准流

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

标准流

那为什么我们从键盘输入数据、向屏幕输出数据时,并没有打开流这个操作呢?
那是因为C语言程序启动时,会自动打开三个流:

  • stdin-标准输入流:在大多数的环境下从键盘输入,scanf函数就是从标准输入流中读取数据。
  • stdout-标准输出流:在大多数环境下将数据输出到屏幕上,printf函数就是将数据输出到标准输出流上的。
  • stderr-标准错误流:在大多数环境下,将错误信息输出到屏幕上

就是因为默认打开了这三个流,所以我们在使用scanf、printf等函数就可以直接的进行输入输出操作。

stdin、stdout、stderr这三个流的类型都是FILE*,该类型通常被称为文件指针。
C语言就是通过FILE*的文件指针来维护流的各种操作的。

4.2文件指针

每个被使用的文件都在内存中开辟了一个对应的文件信息区,用来存放文件的相关信息(如文件名,文件状态和文件当前的位置)。这些信息都存放在一个结构体变量中,该结构体类型由系统声明为FILE
例如在VS2013编译环境中的stdio.h头文件中有以下文件类型的声明:

struct _iobuf {char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};typedef struct _iobuf FILE;

但VS2022编译环境中已经不一样了:

    typedef struct _iobuf{void* _Placeholder;} FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件时,系统就会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,我们使用者并不需要关心其中的细节。

创建FILE*类型的指针变量:

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

将pf定义为一个FILE类型的指针变量,可以使pf指向某个文件的文件信息区(使一个结构体变量),通过该文件信息区中的信息就可以访问该文件。
也就是说,我们可以通过文件指针变量来间接找到与它关联的文件
如图:
在这里插入图片描述

4.3文件的打开和关闭

文件在读写之前要打开文件,使用结束后应该关闭文件(常识)。
在编写程序时,打开文件的同时会返回一个FILE*类型的指针,这也相当于建立了指针和文件的关系。
ANSI C规定了使用fopen函数来打开文件,使用fclose来关闭文件。

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

如果fopen函数打开文件失败,会返回NULL

mode表示文文件的打开方式:

文件使用方式含义如果指定文件不存在
“r”(只读为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+(读写)”为了读和写,打开⼀个⽂本⽂件出错
“w+(读写)”为了读和写,打开⼀个⽂本⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“a+(读写)”打开⼀个⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件
“rb+(读写)”为了读和写打开⼀个⼆进制⽂件出错
“wb+(读写)”为了读和写打开⼀个⼆进制⽂件(每一次打开都会清空文件内容)建⽴⼀个新的⽂件
“ab+(读写)”打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

实际代码:

int main()
{//打开文件FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");exit(1);//该函数的头文件为<stdlib.h>}//操作文件fputs("fopen example", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行前:在这里插入图片描述

运行后:
在这里插入图片描述

结语

最后感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!!!

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

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

相关文章

【小红书采集工具】根据搜索关键词批量采集小红书笔记,含笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴都了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff0c;支持…

【C++】string类的使用①(默认成员函数 || 迭代器接口begin,end,rbegin和rend)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f308;关于string类&#x1f308;string类的成员函数&#x1f525;默认成员函数string类对象的构造(constructor)string类对象的析构string类对象的赋值运算符…

NPOI生成word浮动图标

1、NPOI版本2.7.0, net框架4.8 2、安装OpenXMLSDKToolV25.msi 3、先创建一个word文档&#xff0c;并设置图片为浮于文字之上 4、OpenXML显示的结果 5、实际代码如下&#xff1a; public class GenerateWordDemo {public GenerateWordDemo(){}//https://blog.fileformat.co…

前端笔记-day03

文章目录 01-初始CSS02-CSS引入方式03-标签选择器04-类选择器05-id选择器06-通配符选择器07-画盒子08-字体大小09-文字粗细10-字体倾斜11-行高12-行高垂直居中13-字体族14-font复合属性15-文本缩进16-文本对齐方式17-图片对齐方式18-文本修饰线19-文字颜色20-调试工具21-综合案…

Dual Aggregation Transformer for Image Super-Resolution论文总结

题目&#xff1a;Dual Aggregation Transformer&#xff08;双聚合Transformer&#xff09; for Image Super-Resolution&#xff08;图像超分辨&#xff09; 论文&#xff08;ICCV&#xff09;&#xff1a;Chen_Dual_Aggregation_Transformer_for_Image_Super-Resolution_ICCV…

IM 是什么?

在当今数字化的时代&#xff0c;即时通讯&#xff08;IM&#xff09;已经渗透到人们的日常生活和企业的工作环境中。IM技术的快速i发展为人们提供了一种高效、便捷的沟通方式&#xff0c;不仅推动了社会的信息化进程&#xff0c;也提升了企业的协同效率和竞争力。 作为企业级I…

【GD32】01-GPIO通用输入输出

GD32 闲话说在前头 这里又开一个系列啦。 原因就是之前买了立创开发板的9.9的GD32E230C8T6的板子&#xff0c;买都买了就跟着立创开发板学习一下&#xff08;属于是一次性支持了两个国产品牌了&#xff0c;立创和兆易创新&#xff09;。并且我还买了GD32F407VET6的板子&…

C++:关于圆形鱼眼半全景图转为等距圆柱投影图

C&#xff1a;空间坐标映射到球面坐标/全景图_如何将球体坐标映射到球面uv-CSDN博客 C&#xff1a;关于360全景图像和立方体6面全景图像的相互转换_彩色全景拆解正方体6个面-CSDN博客 之前记录了立方体和360全景之间的转换&#xff0c;这次记录下鱼眼图与360全景图之间的转换…

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…

软件体系结构总结

文章目录 一、软件体系结构概述1.1 基本概念1.1.1 背景1.1.2 定义1.1.3 系统1.1.3.1 定义1.1.3.2 特性1.1.3.3 系统的体系结构 1.1.4 软件设计的层次性1.1.5 体系结构的类别&#xff08;类型&#xff09;1.1.6 重要性&#xff08;意义&#xff09; 1.2 模块及其设计1.2.1 定义1…

HTTP超时时间设置

在进行超时时间设置之前我们需要了解一次http请求经历的过程 浏览器进行DNS域名解析&#xff0c;得到对应的IP地址根据这个IP&#xff0c;找到对应的服务器建立连接&#xff08;三次握手&#xff09;建立TCP连接后发起HTTP请求&#xff08;一个完整的http请求报文&#xff09;服…

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是…

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

Stable Diffusion教程|图生图原理和实战

Stable Diffusion凭借其卓越的图生图功能&#xff0c;极大地提升了图像生成的可控性与输出品质&#xff0c;赋予用户前所未有的个性化创作风格表达能力。这一革新特性使得Stable Diffusion不仅能精准地捕捉用户的艺术愿景&#xff0c;更能以数字化手段孕育出新颖且极具创意的画…

【Java 8】Lambda: mAA::get 返回函数式接口实例

正文 代码介绍&#xff1a;分别有两个函数式接口Lazy跟LazyDependencyCreator&#xff0c;一个HashMap存储<Object, LazyDependencyCreator>键值对。重点在于mProviders.put(AA.class,mAA::get)&#xff0c;看了很久都没看懂&#xff0c;mAA::get返回的不是mAA本身吗&am…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…

使用J-Link Commander / JFlash 烧写固件程序(以STM32F103C8T6为例)

使用JFlash 烧写流程 运行JFlash, 点击Project Settings 配置Jlink为SWD方式,选择连接设备为STM32F103C8T6, 点击确定. 选择要烧录的Bin文件 设置bin文件烧录地址, 点击OK(地址要在0x08000000-0x0800FFFF范围内) Note : STM32F103C8T6 Flash大小为 64KB&#xff0c; 地址范围…

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处&#xff1a; 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化&#xff1b; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

八. Django项目之电商购物商城 -- 添加邮箱

Django项目之电商购物商城 – 添加邮箱 一. 用户中心 添加邮箱功能在用户中心中 , 先完善用户中心功能 1. 视图 # 用户中心 class UserInfoCenterView(LoginRequiredMixin,View):def get(self , request):context {username : request.user.username,mobile : request.use…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …