C语言详解(文件操作)1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
💥💥个人主页:奋斗的小羊
💥💥所属专栏:C语言

🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。


目录

  • 前言
  • 一、文件的定义
    • 1.1 什么是文件?
    • 1.2 二进制文件和文本文件
  • 二、文件的打开和关闭
    • 2.1 流和标准流
      • 2.11 流
      • 2.12 标准流
    • 2.2 文件指针
    • 2.3 文件的打开和关闭
      • 2.31 fopen 和 fclose
      • 2.32 文件在当前的工程目录底下
      • 2.33 文件在当前工程目录底下的上一级路径
      • 2.34 文件不在当前工程目录底下
  • 总结

前言

我们写的程序的数据存储在电脑的内存中,如果没有文件,当程序退出的时候,内存会回收,那数据就丢失了,等再次运行程序是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们就要使用文件。


一、文件的定义

1.1 什么是文件?

按文件的功能分类,文件分为程序文件数据文件,文件是存在磁盘(硬盘)上的。

程序文件:源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)
数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件

本篇文章讨论的是数据文件。
以前我们所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到屏幕上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件。

标识文件——文件名
一个文件要有一个唯一的文件标识,也就是文件名
文件名包含三部分:文件路径+文件名主干+文件后缀,如:c:\code\test.txt


1.2 二进制文件和文本文件

按文件的内容分类,数据文件又分为二进制文件和文本文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符的形式存储的文件就是文本文件

一个数据在文件中是怎么存储的呢?
字符只能以ASCII码的形式存储,数值型数据既可以用ASCII码的形式存储,也可以使用二进制形式存储

比如数字10000,在内存中整型10000是以补码的形式存的,如果以ASCII码形式输出到磁盘,则磁盘中占用5个字节(每个字符占用一个字节),如果以二进制形式输出,则在磁盘中占用4个字节

在这里插入图片描述


二、文件的打开和关闭

2.1 流和标准流

2.11 流

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

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流实现的,一般情况下,我们要想向流里写数据或读数据,都是要打开流,然后操作。


2.12 标准流

以前我们在键盘上输入数据,在屏幕上输出数据,怎么没有打开流呢?
因为C语言程序在启动的时候,默认打开了下面这3个流:

  • stdin:标准输入流,在大多数环境中从键盘输入,scanf函数就是从标准输入流中读取数据
  • stdout:标准输出流,大多数环境中输出到显示器界面,printf函数就是将信息输出到标准输出流中
  • stderr:标准错误流,大多数环境中输出到显示器界面

stdinstdoutstderr三个流的类型是FILE *,通常称为文件指针,C语言中就是通过FILE *的文件指针来维护流的各种操作


2.2 文件指针

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

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE类型的变量,并填充其中的信息,使用者不必关心细节
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便
例如创建一个FILE *的指针变量:

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

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


2.3 文件的打开和关闭

2.31 fopen 和 fclose

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

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

mode表示文件的打开模式,下面是文件的常见打开模式:
文件访问
模式字符串	含义	解释	若文件已存在的动作	若文件不存在的动作
"r"	读	打开文件以读取	从头读	打开失败
"w"	写	创建文件以写入	销毁内容	创建新文件
"a"	后附	后附到文件	写到结尾	创建新文件
"r+"	读扩展	打开文件以读/写	从头读	错误
"w+"	写扩展	创建文件以读/写	销毁内容	创建新文件
"a+"	后附扩展	打开文件以读/写	写到结尾	创建新文件


2.32 文件在当前的工程目录底下

开始时当前工程目录底下没有test.txt这个文件
在这里插入图片描述

运行下面的代码:

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

请添加图片描述

在运行上面的代码前我们的文件夹中是没有test.txt这个文件的,当我们运行结束后文件夹中就出现了这么一个文件,并且大小为0


2.33 文件在当前工程目录底下的上一级路径

如果fopen函数操作的文件不在当前工程目录底下,我们需要在文件的前面加上文件位置,如果有转义字符需要用转义转义字符‘\’处理

假如我们就在当前工程目录底下的上一级路径下创建一个文件,里面存入一些数据
请添加图片描述

运行下面的代码:

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

在这里插入图片描述

可以看到文本内容消失,大小为0


2.34 文件不在当前工程目录底下

如果fopen函数操作的文件不在当前工程目录底下,我们需要在文件的前面加上文件位置,如果有转义字符需要用转义转义字符‘\’处理

我们先在桌面上创建一个文本文档,写入一些数据保存
在这里插入图片描述

运行下面的代码:

#include <stdio.h>int main()
{//打开文件//成功返回有效指针,失败返回NULLFILE* pf = fopen("C:\\Users\\86181\\Desktop\\test.txt", "w");//                绝对路径if (pf == NULL){perror("fopen");return 1;}//写文件//关闭文件fclose(pf);pf = NULL;return 0;
}

查看桌面上的文本文档,发现里面的内容已经被清空
在这里插入图片描述


总结

  • 本篇文章介绍了为什么要有文件,文件的定义,文件的大致分类,流的概念,以及至关重要的文件指针,通过文件指针对文件的打开和关闭,还有当文件在不同路径下如何操作文件等等,通过本文我们对文件有了基本的认识,下篇文章将继续探讨

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

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

相关文章

通过在idea上搭建虚拟hadoop环境使用MapReduce做词频去重

idea上的MapReduce ​ 一般在开发中&#xff0c;若是等到环境搭配好了再进行测试或者统计数据&#xff0c;数据处理等操作&#xff0c;那会很耽误时间&#xff0c;所以一般都是2头跑&#xff0c;1波人去在客户机上搭建环境&#xff0c;1波人通过在idea上搭建虚拟hadoop环境&am…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

奇安信停服,国内还有什么可用的高防么?

这里写自定义目录标题 背景DDOS怎么办&#xff1f;方案推荐总结 背景 继前段时间百度云加速通知免费服务&#xff0c;6月底奇安信也将停止服务&#xff0c;到时候国内将几乎不存在免费好用的高防CDN了&#xff1b;类似的事情还有阿里云和腾讯云的一年期免费SSl证书也都停止供应…

C++:SLT容器-->deque

C:SLT容器-->deque 1. 构造函数2. deque 赋值操作3. deque 大小操作4. deque 插入和删除5. deque 容器数据存取6. deque 排序操作 双端数组&#xff0c;可以对头部和尾部进行插入删除操作 需要导入头文件#include <deque> 1. 构造函数 deque deqT; // 默认构造函数 de…

vue-2 组件传值

组件关系分类 父子关系非父子关系 父子通信流程 父组件通过props将数据传递给子组件 给子组件以添加属性的方式传值子组件内部通过 props 接收模板中直接使用 props 接收的值 父组件 Parent.vue <template><div class"parent" style"border: 3px s…

CST Studio Suite 2020 软件安装教程、安装包下载

CST Studio Suite 2020 安装教程 安装包下载 复制链接在浏览器打开 https://www.qqres.com/3150.html CST Studio Suite 是由Dassault Systmes公司开发的一套电磁场仿真软件。它应用于电子、通信、天线设计、射频与微波、电磁兼容性 (EMC)、电磁干扰 (EMI) 等领域。 CST St…

Unity协程学习心得

前言 个人总结的一些Unity协程学习心得&#xff0c;如有不对请在评论区指出一起学习&#xff01;感谢。 在Unity编程中谈到异步逻辑&#xff0c;可以考虑使用协程来实现。协程&#xff08;Coroutine&#xff09;在Unity中的主要作用就是把一个任务暂停&#xff08;挂起&#…

智慧园区建设方案(Word)

1. 楼栋管理 2. 物业管理 3. 安防管理 4. 门禁管理 5. 停车管理 6. 能源管理 7. 环保管理 8. 园区生活服务 9. 招商管理 10. 收费中心 11. 园区地图 12. 门户网站 软件整套原件获取&#xff1a;本文末个人名片。

使用DPO微调大模型Qwen2详解

简介 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback&#xff0c;RLHF) 事实上已成为 GPT-4 或 Claude 等 LLM 训练的最后一步&#xff0c;它可以确保语言模型的输出符合人类在闲聊或安全性等方面的期望。但传统的RLHF比较复杂&#xff0c;且还需要奖励…

BabylonJS 6.0文档 Deep Dive 动画(四):通过动画排序制作卡通片

一种最为直接的方法是为每个动画剪辑&#xff08;Animatin Clip&#xff09;指定开始时间&#xff0c;最终形成一个卡通动画&#xff08;Cartoon&#xff09;。 1. 设计 1.1 概述 动画的脚本如下&#xff1a; 摄像机显示了一栋带门的建筑物。摄像机靠近门并停止。门打开&am…

掌控数据流:深入解析 Java Stream 编程

Java 8 引入了一种新的抽象称为流&#xff08;Stream&#xff09;&#xff0c;它可以让你以一种声明的方式处理数据。Java 8 Stream API 可以极大提高 Java 程序员的生产力&#xff0c;使代码更简洁&#xff0c;更易读&#xff0c;并利用多核架构进行外部迭代。这里将详细介绍 …

【NoSQL数据库】Redis简介

Redis Redis简介 Redis关系型数据库和非关系型数据库Redis 简介redis速度快的原因 Redis 配置Linux 源码安装redis命令工具 关系型数据库和非关系型数据库 关系型数据库&#xff08;Relational Database&#xff09;和非关系型数据库&#xff08;Non-Relational Database&…

重学Spring总结

1、Spring框架的诞生 文章目录 1、Spring框架的诞生1、BeanFactory 快速入门1.1、BeanFactory完成了loC思想的实现&#xff1a;1)导入Spring相关的依赖&#xff1a;2)定义Uservice接口及其UserviceImpl实现类&#xff1b;3)创建Bean的配置资源文件&#xff0c;文件名最好为&…

新材料正不断推动模具3D打印行业发展

随着工业4.0的浪潮席卷全球&#xff0c;模具制造行业也迎来了技术革新的新纪元。3D打印技术以其独特的制造优势&#xff0c;正逐渐在模具制造领域崭露头角。然而&#xff0c;要实现模具3D打印技术的广泛应用&#xff0c;高性能的打印材料是不可或缺的关键因素。 材料是模具3D打…

【Golang】Map 稳定有序遍历的实现与探索:保序遍历之道

【Golang】Map 稳定有序遍历的实现与探索&#xff1a;保序遍历之道 大家好 我是寸铁&#x1f44a; 总结了一篇【Golang】Map 稳定有序遍历的实现与探索&#xff1a;保序遍历之道✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言&#x1f34e; 在计算机科学中&#xff0c;数据结…

【内存管理】内存管理概述

文章目录 内存管理硬件结构早期内存的使用方法分段分页逻辑地址&#xff0c;线性地址&#xff08;intel架构&#xff09;虚拟地址物理地址结构图 虚拟地址到物理地址的转换内存管理总览系统调用vm_area_struct缺页中断伙伴系统slab分配器页面回收反向映射KSMhuge page页迁移内存…

[AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能

总结 Google 正在为超过 35 种语言的 Gemini Advanced 订阅者推出 Gemini 1.5 Pro。此次更新包括 100 万个 token 的上下文窗口、改进的数据分析功能和增强的多模态图像理解。新功能包括用于自然对话的 Gemini Live、先进的规划工具和可定制的 Gems。更新还集成了更多 Google …

【MySQL】(基础篇五) —— 排序检索数据

排序检索数据 本章将讲授如何使用SELECT语句的ORDER BY子句&#xff0c;根据需要排序检索出的数据。 排序数据 还是使用上一节中的例子,查询employees表中的last_name字段 SELECT last_name FROM employees;输出结果&#xff1a; 发现其输出并没有特定的顺序。其实&#xf…

电子电气架构 --- 信息安全测试模糊测试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

Objective-C的初始化方法中,应该如何读写属性

除非有明确的原因需要使用setter, getter, 否则总是应该直接访问, 也就是直接使用实例变量&#xff08;也称为 iVar&#xff09;来读写数据 理由&#xff1a; 避免子类覆盖setter方法的影响&#xff1a;若在初始化方法中使用setter方法, 使用此方法实例化子类, 可能会调用子类…