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
:标准错误流,大多数环境中输出到显示器界面
stdin
、stdout
、stderr
三个流的类型是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函数来关闭文件
函数fopen
和fclose
在头文件<stdio.h>
中定义
//打开文件
FILE *fopen( const char *filename, const char *mode );//关闭文件
int fclose( FILE *stream );
mode
表示文件的打开模式,下面是文件的常见打开模式:
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;
}
查看桌面上的文本文档,发现里面的内容已经被清空
总结
- 本篇文章介绍了为什么要有文件,文件的定义,文件的大致分类,流的概念,以及至关重要的文件指针,通过文件指针对文件的打开和关闭,还有当文件在不同路径下如何操作文件等等,通过本文我们对文件有了基本的认识,下篇文章将继续探讨
相关文章:
C语言详解(文件操作)1
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
Python Requests库详解
大家好,在现代网络开发中,与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言,提供了各种工具和库来简化这一过程。其中,Requests库作为Python中最受欢迎的HTTP库之一,为开发人员提供了简单而…...
Kafka 详解:全面解析分布式流处理平台
Kafka 详解:全面解析分布式流处理平台 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流式应用。它具有高吞吐量、低延迟、高可用性和高可靠性的特点,广泛应用于日志收集、数据流处理、消息系统、实时分析等场景。 &…...
RabbitMQ系列-rabbitmq无法重新加入集群,启动失败的问题
当前存在3个节点:rabbitmq5672、rabbitmq5673、rabbitmq5674 当rabbitmq5673节点掉线之后,重启失败 重启的时候5672节点报错如下: 解决方案 在集群中取消失败节点 rabbitmqctl forget_cluster_node rabbitrabbitmq5673删除失败节点5673的…...
postgresql之翻页优化
列表和翻页是所有应用系统里面必不可少的需求,但是当深度翻页的时候,越深越慢。下面是几种常用方式 准备工作 CREATE UNLOGGED TABLE data (id bigint GENERATED ALWAYS AS IDENTITY,value double precision NOT NULL,created timestamp with time zon…...
小白学Linux | 日志排查
一、windows日志分析 在【运行】对话框中输入【eventvwr】命令,打开【事件查看器】窗 口,查看相关的日志 管理员权限进入PowerShell 使用Get-EventLog Security -InstanceId 4625命令,可获取安全性日志下事 件 ID 为 4625(失败登…...
Spring6
一 概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...
数字孪生概念、数字孪生技术架构、数字孪生应用场景,深度长文学习
一、数字孪生起源与发展 1.1 数字孪生产生背景 数字孪生的概念最初由Grieves教授于2003年在美国密歇根大学的产品全生命周期管理课程上提出,并被定义为三维模型,包括实体产品、虚拟产品以及二者间的连接,如下图所示: 2011年&…...
云服务对比:阿里云国际站和阿里云国内站有什么区别
阿里云国际站(Alibaba Cloud International)和阿里云国内站(Alibaba Cloud China)在许多方面存在明显区别,这些区别主要体现在服务范围、合规性、定价和支付方式、语言和客服支持、以及备案要求等方面。 首先…...
如何在npm上发布自己的包
如何在npm上发布自己的包 npm创建自己的包 一、一个简单的创建 1、创建npm账号 官网:https://www.npmjs.com/创建账号入口:https://www.npmjs.com/signup 注意:需要进入邮箱验证 2、创建目录及初始化 $ mkdir ufrontend-test $ cd ufron…...
SQL Chat:从SQL到SPEAKL的数据库操作新纪元
引言 SQL Chat是一款创新的、对话式的SQL客户端工具。 它采用自然语言处理技术,让你能够像与人交流一样,通过日常对话的形式对数据库执行查询、修改、创建及删除操作 极大地简化了数据库管理流程,提升了数据交互的直观性和效率。 在这个框…...
jmeter性能优化之mysql配置
一、连接数据库和grafana 准备:连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等,还有过节像618,双11和数据库交互非常庞大,都会存在数据库的某一张表里面,当用户在登录或者查询某一个界面时&…...
VueRouter3学习笔记
文章目录 1,入门案例2,一些细节高亮效果非当前路由会被销毁 3,嵌套路由4, 传递查询参数5,命名路由6,传递路径参数7,路径参数转props8,查询参数转props9,replace模式10&am…...
「前端+鸿蒙」鸿蒙应用开发-TS函数
在 TypeScript 中,函数是一等公民,这意味着函数可以作为参数传递、作为其他函数的返回值,甚至可以赋值给变量。TypeScript 为 JavaScript 的函数增加了类型系统,使得函数的参数和返回值都具有明确的类型。 TS快速入门-函数 基本函…...
python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制
实现效果(红框内): 后端api如下: task_api.route(/user/task/states_list, methods[POST, GET]) visitor_token_required def task_states(user):name_list [待接单, 设计中, 交付中, 已完成, 全部]data []color [#F04864, …...
mingw如何制作动态库附python调用
1.mingw和msvc g -fpic HelloWorld.cpp -shared -o test.dllg -L . -ltest .\test.cpp 注意-L后面的.挨不挨着都行,-l不需要-ltest.dll,只需要-ltest 2.dll.cpp extern "C" {__declspec(dllexport) int __stdcall add(int a, int b) {return…...
Vue学习|Vue快速入门、常用指令、生命周期、Ajax、Axios
什么是Vue? Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写 基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。官网:https://v2.cn.vuejs.org/ Vue快速入门 打开页面࿰…...
Python基础教程(八):迭代器与生成器编程
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
Oracle10.2.0.1冷备迁移之_数据文件拷贝方式
由于阿里云机房要下架旧服务器,单位未购买整机迁移服务,且业务较老不兼容Oracle11g,所以新购买一台新服务器进行安装Oracle10.2.0.1 ,后续再将数据迁移到新服务器上。 id 数据库版本 操作系统版本 实例名 源库 115.28.242.25…...
智能合约中外部调用漏洞
外部调用 : 在智能合约开发中,调用不受信任的外部合约是一个常见的安全风险点。这是因为,当你调用另一个合约的函数时,你实际上是在执行那个合约的代码,而这可能会引入你未曾预料的行为,包括恶意行为。下面…...
转型AI产品经理(4):“认知负荷”如何应用在Chatbot产品
认知负荷理论主要探讨在学习过程中,人脑处理信息的有限容量以及如何优化信息的呈现方式以促进学习。认知负荷定律认为,学习者的工作记忆容量是有限的,而不同类型的认知任务会对工作记忆产生不同程度的负荷,从而影响学习效果。以下…...
【C++11】常见的c++11新特性(一)
文章目录 1. C11 简介2. 常见的c11特性3.统一的列表初始化3.1initializer_list 4. decltype与auto4.1decltype与auto的区别 5.nullptr6.右值引用和移动语义6.1左值和右值6.1.1左值的特点6.1.2右值的特点6.1.3右值的进一步分类 6.2左值引用和右值引用以及区别6.2.1左值引用6.2.2…...
牛客周赛 Round 46 题解 C++
目录 A 乐奈吃冰 B 素世喝茶 C 爱音开灯 D 小灯做题 E 立希喂猫 F 祥子拆团 A 乐奈吃冰 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <set> #include <vector>…...
9.3 Go 接口的多态性
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
Java通过字符串字段匹配形成树形结构
Java通过字符串字段匹配形成树形结构 文章目录 Java通过字符串字段匹配形成树形结构数据表模拟数据解决办法:1、domian 类:2、Node层(形成树形关系):3、controller 层4、Util 工具类1、BeanCopierUtil4、Mapper5、Manager(用来组装树形结构)6、测试:有的时候我们形成树形不…...
数字孪生智慧水利:精准管理与智能决策的新时代
图扑数字孪生技术在智慧水利中的应用,通过虚拟模型与真实水利系统的无缝连接,实现对水资源和水利工程的全面监控和精细管理。实时数据采集与动态模拟提升了水利系统的预测和响应能力,从洪水预警到水质监测,数字孪生助力各项决策更…...
基于ChatGLM3的本地问答机器人部署流程
基于ChatGLM3的本地问答机器人部署流程 前言一、确定文件结构1.新建文件夹储存本地模型2.下载源码和模型 二、Anaconda环境搭建1.创建anaconda环境2.安装相关库3.设置本地模型路径4.启动 三、构建本地知识库1.下载并安装postgresql2.安装c库3.配置向量插件 四、线上运行五、 全…...
归并排序——逆序数对的统计
逆序数对的统计 题目描述 运行代码 #include <iostream> using namespace std; #define LL long long const int N 1e5 5; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) {if (l > r)return 0; int mid l r >> 1; LL res merge_sort(q, l,…...
基于截图和模拟点击的自动化压测工具开发(MFC)
1.背景 想对一个MFC程序做自动压测功能,根据判断程序界面某块区域是否达到预定状态,来自动执行鼠标点击或者键盘输入的操作,以解决测试人员需要重复手动压测问题。 1.涉及的技术 串口控制,基于MFC橡皮筋类(CRectTracker)做一个…...
力扣每日一题 6/10
881.救生艇[中等] 题目: 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…...
深圳市罗湖区住房和建设局网站/产品软文撰写
1、打开图片,复制背景,关闭背景眼睛。单击 滤镜 -抽出, 我们要学会观察图片,先来看下面这张图: 这张图片色彩虽然不算丰富,但也不是纯色背景,甚至有些许的零乱,但人物的主…...
网站建设 发布/现在推广什么app最挣钱
Ajax技术在当前的web开发领域显得非常热门、使这个称"新瓶装旧酒"的技术一下子成为人门口中的热门词汇!为了不让自己落伍、在繁忙的工作之余、偶也开始学习Ajax...(这里用的是Ajax.Net框架)下是一个小例子、来说明Ajax所带来的用户体验!1.新建一个项目、添…...
中小企业网站建设济南兴田德润电话/seo软件资源
在Jenkins 项目写了很多剧本。有时候,我发现脚本失败,但Jenkins运行成功。Jenkins无论是通过退出代码0比量build成功。因此,newLISP在。您可以使用(exit)对于成功。(exit 1)它表示失败。这样就须要添加一些脚本的推断,比方&#x…...
做水果网站特点分析报告/公司搭建网站
2019独角兽企业重金招聘Python工程师标准>>> 创建与删除: //创建文件管理器 NSFileManager *fileManager [NSFileManager defaultManager]; //获取路径 //参数NSDocumentDirectory要获取那种路径 NSArray *paths NSSearchPathForDirectoriesInDomains(…...
网站实用性/上海推广网络营销咨询热线
假设条件:已经有苹果开发者账号(如果没有,请先注册好苹果开发者账号) 开发环境: 名称版本开发机(虚拟PC)操作系统windows 10(Version 21H2 64位)MAC系统(in…...
杭州市上城区建设局网站/自媒体平台注册入口
我们日常开发的打包或者 SDK 的打包会生成一个ipa 或者 framework。在 framework 和 ipa 文件中其实都可以找到一个 exec 文件。这个文件就是一个 Mach-O 文件。这一次主要就是深入的去了解 Mach - O 文件在到底都用来做什么。 (一)了解 Mach - O 的结构…...