C语言进阶指南(20)——文件操作

news2024/11/17 16:02:04

欢迎来到博主的专栏:C语言进阶指南

文章目录

    • 一、流
    • 二、 文件
    • 三、数据文件
      • 二进制文件
      • 文本文件
    • 四、流的打开方式
      • 数据的输入\输出
      • 文件流
      • 文件指针
      • 打开文件流
        • (a)文件名
        • (b)打开模式
        • (c)实际应用
        • (b)关闭文件流

一、流

流(scream)是一个抽象出来的概念,表示一个输入的源,或者输出的目的地。

比如前面常常用的scanf函数,就是从输入流(键盘输入的字符)向程序输入数据。printf函数就是通过输出流,向屏幕输出数据。

对文件进行读/写操作时,也需要打开一个流,通过这个流来输入/输出数据

二、 文件

打开电脑中的存储信息,这些存储在硬盘的被称为文件。文件有程序文件,数据文件
在这里插入图片描述

程序文件,用来存储程序(.exe)或者程序的源码(比如.c文件)的文件
数据文件,存储用来读/写的数据的文件称为数据文件

文件操作函数对象通常是数据文件,因此本篇文章中文件指的通常是数据文件

三、数据文件

数据文件根据数据存储的形式又分为二进制文件和文本文件

二进制文件

将数据以二进制的形式存储的文件被称为二进制文件。
比如将一个int类型的数据10000以二进制的形式存储在文件当中,那么数据在二进制中被记录为
在这里插入图片描述
考虑到vs编译器数据在内存中的存储形式是小端存储,所以实际的二进制存储形式应为

16 27 00 00(16进制)

文本文件

数据以ASCII码的形式存储在文件当中,这种文件被称为文本文件
以整型数据10000为例,文本文件的存储形式为数据的ASCII码形式。
在这里插入图片描述

四、流的打开方式

数据的输入\输出

在日常当中,计算机与外部设备是经常出现数据传递的,比如键鼠对计算机的操作、计算机向音箱传递数字信号等,这些都是计算机与外部设备的数据交换。

通常来说,完成这些操作都需要有硬件设备来进行连接,这些接口往往要进行硬件层面的操作,来实现这些功能。以图为例
在这里插入图片描述
作为更擅长于软件操作的程序员来说,程序员更需要考虑的是这些数据的处理、不用过多的考虑怎么将这些数据输出\输入到硬件设施。

流(scream)就能很好的做到这一点,流是一个承载这些数据的抽象概念。⽅便程序员对各种设备进⾏⽅便的操作。如果需要对某些数据进行输入\输出的操作,只需要对“流”进行操作。

至于“流”与外部设备如何连接、传输,这是更加底层的原理、交由负责这一领域的工作者完成。程序员要做到的是对流进行操作。

“流”可以视为数据与外部设备的数据中转站,因为“流”是一大堆数据的抽象,可以视为是一片数据构成的数据地带。

在这里插入图片描述

文件流

文件里的数据可以通过流,传输给计算机。也可以让计算机通过流,传输给文件。 因此文件和计算机之间的流称为“文件流”。

文件指针

先来观看一个文件指针是如何创建的

FILE* PF;

可以看到这个指针的类型是很陌生的,不同于以往常见的数据类型(比如int,char,float……)。

这个FILE类型的变量不是C语言中原有的变量,而是一个定义在<stdio.h>这个头文件中,数据的主要内容是文件的信息。

每个文件在打开时都会在内存中开辟一个”文件信息区”。在这个信息区中,存储的内容都是文件的信息、如文件名、文件状态、文件位置等。

而这些数据的类型则是FILE类型,FILE类型可以在头文件中看到定义(不同的编译器有着不同的定义)

比如vs中的FILE类型的定义为
在这里插入图片描述
可以看到一个文件的信息、全都保存在这个结构体类型的数据当中。

在这里插入图片描述
这个文件信息的数据类型就是FILE类型。

用来指向这片文件信息区的指针,就叫做文件指针,类型为FILE*。

打开文件流

打开文件流用到一个打开文件的函数——fopen函数
在这里插入图片描述

(a)文件名

首先观察fopen的函数原型的第一个参数

filename是一个char*类型的指针,可以认为是一个字符串,这个字符串的含义是想要打开的文件“流”的文件名

文件名有两种形式
(1)相对路径
,即这个文件在磁盘中,相对于想要使用文件“流”的程序文件的相对的目录。

比如一个程序文件“test.c”为例,要在这个文件中打开一个“data.txt”的文本文件。可以翻找磁盘中“data.txt”的路径,相对路径的文件名遵循以下规则(“test.c”为当前文件,“data.txt”为目的文件)

.\表示当前文件的目录。
. .\表示当前文件的上一级目录。
如果目的文件在当前文件的上一级目录下再上一级,就在开头多加上. .\,以此类推。(注意\之前的小数点!!!!)
如果目的文件和当前文件一个目录,那么可以省略“.\”。

以下图为例。
在这里插入图片描述
“data.txt”与“test.c”在同一目录下,于是“data.txt”与“test.c”的相对路径为“.\data.txt”或者“data.txt”。
注意这个相对路径要以字符串的形式写进去,为了避免“\”生成转义字符,所以正确的写法应为

FILE* pf=fopen("data.txt", );

或者

FILE* pf=fopen(".\\data.txt",);

如果“data.txt”在“test,c”的上一级目录。
那么写法应为

	FILE* pf=fopen("..\\.\\data.txt", "w");

以此类推。
在这里插入图片描述
在这里插入图片描述

可以看到"data.txt"与“test.c”的相对路径是上一个目录的。
(2)绝对路径
可以通过查看文件的属性找到该文件的位置,然后复制粘贴下文件的所有级别的目录。

在这里插入图片描述
比如“data.txt”的绝对路径则是D:\code\test-c\test_1.4\data.txt(不知道为什么我的复制粘贴只能到当前目录–+,没事手动加上)
要注意避免老问题,即转义字符的问题。那么代码应写成

	FILE* pf=fopen("D:\\code\\test-c\\test_1.4\\data.txt",);

绝对路径的弊端在于,当程序移植到其他平台时,由于不同计算机的目录命名不同,移植性会大打折扣(通俗来说就是又要加班改代码啦!!!)所以建议使用相对路径来编写文件操作的

(b)打开模式

在这里插入图片描述
fopen函数的函数原型的第二个参数是“mode”

“mode”是一个char*类型的指针,可以当做一个字符串 “mode”是特定的字符串,用来决定文件的打开形式

以“data.txt”为例,如果想要以“只读”的形式打开,那么mode就是“r”。

	FILE* pf=fopen("data.txt", "r");

不同的打开模式,决定了程序员对该文件的操作权限,比如“只读”模式下,就只能从“data.txt”文件中读入数据,而不能向该文件写入数据。
在这里插入图片描述

(c)实际应用

fopen函数在输入了正确的参数时,会在文件信息区创建出该文件的文件信息,并返回一个FILE类型的指针来指向这片区域,所以通常用一个FILE类型的指针来接收该函数的返回值

FILE* pf=fopen("data.txt", "w");

若文件打开失败,则函数的返回值为NULL。所以可以对指针pf进行检测。

FILE* pf=fopen("data.txt", "w");
if (pf == NULL)
{
	exit(EXIT_FAILURE);
}

此时pf可以当做是这个文件与计算机之间的“流”了,后续对“流”的操作,都是使用文件对应的文件指针来操作。

(b)关闭文件流

在这里插入图片描述
文件流的关闭则显得比较简单了。

参数是一个file*类型的指针,这个指针指向先前打开的文件流

比如关闭“data.txt”的文件“流”,将pf作为参数传输进去即可

FILE* pf=fopen("data.txt", "w");
if (pf == NULL)
{
	exit(EXIT_FAILURE);
}
fclose(pf);

文件关闭函数顺利关闭文件流,则返回值为0。
如果文件关闭函数发生错误,返回值为EOF。
所以可以对fclose函数进行检测,来判断文件流关闭是否存在异常。

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

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

相关文章

如何使用提示压缩来削减 RAG 80% 成本

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research) 原文标题:How to Cut RAG Costs by 80% Using Prompt Compression 原文地址:https://medium.com/towards-data-science/how…

1.1 计算机网络在信息时代的作用

1.1 计算机网络在信息时代的作用 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;Link&#xff09;所组成。网络中的结点可以是计算机、集线器、交换机或者路由器等。 图1-1 多个网络还可以通过路由器互连起来&a…

C语言操作符与表达式详解

目录 操作符的分类&#xff1a; &#xff08;1&#xff09;算数操作符 &#xff08;2&#xff09;移位操作符 &#xff08;3&#xff09;位操作符 &#xff08;4&#xff09;赋值操作符 &#xff08;5&#xff09;单目操作符 &#xff08;6&#xff09;关系操作符 &…

深度解析 Compose 的 Modifier 原理 -- ParentDataModifier

" Jetpack Compose - - Modifier 系列文章 " &#x1f4d1; 《 深入解析 Compose 的 Modifier 原理 - - Modifier、CombinedModifier 》 &#x1f4d1; 《 深度解析 Compose 的 Modifier 原理 - - Modifier.composed()、ComposedModifier 》 &#x1f4d1; 《 深入解…

解决PS“暂存盘已满”错误

问题&#xff1a;PS“暂存盘已满”错误 原因&#xff1a; PS在运行时会将文件的相关数据参数保存到暂存区。当提醒暂存盘满时&#xff0c;说明你当前PS运行的使用盘符空间不足&#xff0c;所以在运行时一定要保留有足够的盘符空间来运行PS。 效果图 解决方案 注意: 我们在使用P…

威士忌品鉴:如何体验这美妙的细节与品质

在浩瀚的品鉴中&#xff0c;威士忌以其特别的魅力吸引了无数品鉴者的目光。作为一种源于苏格兰的蒸馏酒&#xff0c;威士忌的味蕾丰富、香气特别&#xff0c;让人沉醉其中。本文将结合雷盛537威士忌&#xff0c;带你深入探索威士忌的品鉴之道&#xff0c;领略这一美妙的细节与品…

构建基于RHEL8系列(CentOS8,AlmaLinux8,RockyLinux8等)的MySQL8.0.32的RPM包

本文适用&#xff1a;rhel8系列&#xff0c;或同类系统(CentOS8,AlmaLinux8,RockyLinux8等) 文档形成时期&#xff1a;2023年 因系统版本不同&#xff0c;构建部署应略有差异&#xff0c;但本文未做细分&#xff0c;对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…

虹科分享 | 用Redis为LangChain定制AI代理——OpenGPTs

文章速览&#xff1a; OpenGPTs简介Redis在OpenGPTs中的作用在本地使用OpenGPTs在云端使用OpenGPTsRedis与LangChain赋能创新 OpenAI最近推出了OpenAI GPTs——一个构建定制化AI代理的无代码“应用商店”&#xff0c;随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一…

配电柜监测:别再人工巡检!一文讲透!

随着现代社会对电力的依赖性不断增强&#xff0c;各行各业对电力系统的可靠性和安全性提出了更高的要求。 配电柜作为电力系统的核心组成部分&#xff0c;其监控与管理显得尤为重要。为了满足企业对电力系统监测的需求&#xff0c;配电柜监控系统应运而生。 客户案例 制造企业…

cad的模型怎么打散导入3d---模大狮模型网

将CAD中的模型打散并导入3D建模软件&#xff0c;需要以下步骤&#xff1a; 将CAD中的模型进行分组或分层&#xff1a;在CAD中&#xff0c;将模型按照不同的组或层进行分组或分层。这样可以方便地控制每个部分的显示和隐藏&#xff0c;在导入3D建模软件后&#xff0c;也可以更方…

iOS rootless无根越狱解决方案

据游戏工委数据统计&#xff0c;2023年国内游戏市场实际销售收入与用户规模双双创下新高&#xff0c;游戏普遍采用多端并发方式&#xff0c;成为收入增长的主因之一。 中国市场实际销售收入及增长率丨数据来源&#xff1a;游戏工委 多端互通既是机遇&#xff0c;也是挑战。从游…

MySQL中datetime和timestamp的区别

datetime和timestamp的区别 相同点: 存储格式相同 datetime和timestamp两者的时间格式都是YYYY-MM-DD HH:MM:SS 不同点: 存储范围不同. datetime的范围是1000-01-01到9999-12-31. 而timestamp是从1970-01-01到2038-01-19, 即后者的时间范围很小. 与时区关系. datetime是存储…

tiktok_浅谈hook ios之发包x-ss-stub

frida-trace ios手机一部&#xff0c;需要越狱的电脑一台idacrackerXI 目标app&#xff1a; ipa 包&#xff0c;点击前往 密码&#xff1a;8urs 协议分析起始从抓包开始&#xff0c;个人习惯 一般安卓逆向可以直接搜关键词&#xff0c;但是ios 都在 Mach-O binary (reverse…

vue3+ts+vite项目从0 搭建,配置安装router/pinia/element-plus/scss等

一、安装vite环境 官网&#xff1a;https://cn.vitejs.dev/guide/why.html npm init vite1.选择vue 2.选择typescipt 3.创建成功 默认项目结构如下 4.安装项目依赖 npm install 5.启动项目 npm run dev二。安装配置scss 1.运行安装scss npm install -D sass sass-loa…

搜维尔科技:【简报】元宇宙数字人赛道,《全息影像技术应用》!

期待着看展的主角来到今天要参观的全息影像展&#xff0c;平时就喜欢看展的她对于所谓的全息影像非常好奇&#xff0c;于是她带着期待的心情进入展内。进入展内的主角看到的是与之前完全不同的画展&#xff0c;每幅画看起来就像真的一样&#xff0c;充满好奇的她在展览的各处游…

如何在Docker本地搭建流程图绘制神器draw.io并实现公网远程访问

推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软…

PyPDF2 3.0.0更新,一些函数被弃用,需要重新写

1.PdfFileWriter is deprecated and was removed in PyPDF2 3.0.0. Use PdfWriter instead. 这错误表明你正在使用的 PyPDF2 版本中已经移除了 PdfFileWriter&#xff0c;并在版本 3.0.0 中被替代为 PdfWriter。这是因为在 PyPDF2 的更新中&#xff0c;一些 API 被重新组织和更…

目标检测脚本之mmpose json转yolo txt格式

目标检测脚本之mmpose json转yolo txt格式 一、需求分析 在使用yolopose及yolov8-pose 网络进行人体姿态检测任务时&#xff0c;有时需要标注一些特定场景的中的人型目标数据&#xff0c;用来扩充训练集&#xff0c;提升自己训练模型的效果。因为单纯的人工标注耗时费力&…

笔记软件内怎么查看文章字数 笔记查看字数的操作步骤

在记录生活点滴、工作要务时&#xff0c;你是否曾像我一样&#xff0c;为了知道写了多少字而犯愁&#xff1f;尤其是在需要精确控制字数时&#xff0c;那种焦虑感更是如影随形。 记得有一次&#xff0c;我为了一个项目报告苦思冥想&#xff0c;好不容易写了个初稿&#xff0c;…

0111qt

实现闹钟&#xff0c;并播报懒虫...~ daytest.pro: QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (th…