【C语言】文件操作(中卷)

前言

在文件操作(上卷)中,讲到的主要都是正式文件操作开始之前的前置知识,而这一卷中,我们将开始正式地操作文件。

在上卷中我们已经说到,stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流的类型是:FILE*,通常称为文件指针。而C语言,就是通过FILE*的文件指针来维护流的各种操作的。

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件(包括外部设备)都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。当我们打开一个文件时,就会创造一个和这个文件相关的文件信息区。

这些信息保存在一个结构体变量中。该结构体类型是由系统声明的,取名FILE

比如图中,我们现在有一个data.txt文件,操作这个文件就会创造一个FILE类型的文件信息区f,文件信息区和我们的文件建立了一定联系,里面放着文件相关的各种信息。

在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;//使用typedef重命名

可以看到我们的FILE其实是对一个结构体类型的重命名,FILE就是这样一个结构体类型。

所以我们创建的文件信息区就是创建的一个结构体变量。

注意,不同的C编译器的FILE类型包含的内容不完全相同,但大同小异。

每当打开一个文件时,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者则不必关心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

我们的文件信息区是有地址的,我们将其地址放到一个类型为FILE*的指针中去。

我们上面说stdin stdout stderr这三个流的类型是:FILE*,现在我们知道,其实它们就是指向FILE类型文件信息区的三个指针。

每个文件都有自己的文件信息区,文件是在硬盘上放着的,文件信息区是在内存上放着的。

文件的打开和关闭

文件的操作:

1.打开文件---打开流

2.读写文件---读/写流

3.关闭文件---关闭流

 流的底层是怎么做的,不用关心。

ANSI C规定:使用fopen函数来打开文件,fclose来关闭文件。

fopen

 第一个参数是文件名,后一个参数是文件的打开方式。

最终返回的是文件信息的地址。用它可以找到文件信息区,就可以找到流。

mode表示文件的打开模式,有很多种,以下都是:

注意是双引号。

文件操作示意图:

 "w"(只读),如果指定的文件存在,会把文件内容清洗掉,然后展示出一个空的文件;如果指定的文件不存在,就会建立一个新的文件。

演示:

 

可以看到,我们就生成了一个data.txt,大小为0。

 现在我们在data.txt里写一点东西:

那么当我们再次运行程序,此时是已存在这个文件,会发现运行完再打开这个文件发现已经被改为空白了:

这就是"w"(只读)的特点,如果指定的文件存在,会把文件内容清洗掉,然后展示出一个空的文件;如果指定的文件不存在,就会建立一个新的文件。

如果是"r"的方式打开,现在我们还是打开data.txt,因为存在,所以运行起来不会报错。

如果我们把这个文件删除然后再运行:

这时就给出了相应的报错信息:没有这样的文件或目录。

打开文件后我们读文件或写文件,然后我们就要关闭文件

fclose

 所以我们就这样关闭文件:

但是流关掉后,我们的pf的地址其实还在,不会自己置空,避免变为野指针,我们要置为空:

打开其他位置的文件

可以发现,我们现在打开的文件必须在当前工程路径底下,那如果现在我们想打开桌面放置的一个文件呢?

那就加上路径。路径在哪看?右击这个文件点开属性:

可以看到位置一行,后面的就是路径,所以我们这样写:

 

记得将\写为\\,否则会被当做转义字符。 

这种从“根”上开始的写法叫做绝对路径

此外,还有一种相对路径的写法:

比如,我们可以用来打开上一级路径下的文件:

这是我们的工程目录:

(可以理解为test.c所在的这一个目录) 

所以这就是上一级路径:

.表示当前路径,..表示上一级路径,所以我们的代码这样写:

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

这就是,当前路径的上一级路径底下的data.txt文件。

如果我们想要打开上一级的上一级路径下的文件,就这样写:

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

这就是,当前路径的上一级的上一级路径底下的data.txt文件。

从这种写法可以看出,相对路径所谓的相对,就是相对于当前位置的路径的意思。

文件的顺序读写

有两种读写,一种叫顺序读写,一种叫随机读写。

顺序读写函数介绍

 fgetc也就是读字符。fputc是写字符。fgets是读字符串,fputs是写字符串。

文本行就是多个字符的意思。

fscanf和fprintf是格式化输入和输出。

fread和fwrite是二进制输入和输出。

前面的6个函数读和写的都是文本信息(也就是肉眼能看得懂),而后面两个读和写的是二进制的信息。

fputc函数

前一个参数是要写的字符,后一个参数是流 。

现在我们可以把字母a~z写到test.txt中去。

 fgetc函数

只有一个参数,就是流(文件指针),返回一个int。

成功情况返回的是读到字符的ASCII码值。 

如果读取失败,会返回一个EOF。也就是end of file,文件的结束标志,其实设置在全局变量中。 可以写下EOF右击转到定义,会看到其实本质就是-1

那么现在我们可以试着读一下我们刚才写的字符:

其实在我们读或者写的时候,文件都有一个光标在按顺序移动,否则读和写就乱套了。 

 我们还可以这样写,把所有字符都读取:

补充:fgetc fputc的适用范围

这时我们还注意到,上面说到,前6个函数适用于所有输入输出流 ,这是个什么情况呢?

当我们以读的形式打开文件,得到的是文件的输入流;当我们以写的形式打开文件,得到的是文件的输出流。

stdin stdout也是输入和输出流,那么我们前面提到的两个函数也能适用于这两个标准流。

 所以这两个函数可以适用于标准输出输入流或文件输出输入流。

到此,本文内容就结束了,后面会继续补充文件操作相关的内容,祝阅读愉快^_^

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

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

相关文章

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name:包名,标识应用程序,默认应用ID也使用该名 Compile SDK:编译时API版本 2.工程目录 AppScope:应用全局所需资源 entry:应用的主模块,含代码、资源 hvigor&#…

TimeDao-一篇文章了解清楚Subspace项目

1 项目简介 什么是Subspace网络? Subspace是为下一波加密创建者构建的第四代区块链。旨在实现web3规模扩容。 Subspace允许开发者以互联网规模运行 Web3 应用。它提供了一个简单的接口,用于快速部署按需求自动扩展的多链去中心化应用。Subspace由一个…

神经网络与深度学习——第7章 网络优化与正则化

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第7章 网络优化与正则化 网络优化与正则化 网络优化 网络结构多样性 高维变量的非凸优化 神经网络优化的改善方法 优化算法 小批量梯度下降 批量大小选择 学习率调整 学习率衰减 学习率预热 周期性学习率调…

HCIP-Datacom-ARST自选题库__EBGP【18道题】

一、单选题 1.在排除EBGP邻居关系故障时,你发现两台直连设备使用Loopback口建立连接,故执行display current-configurationconfiguration bgp查看peer ebgp-max-hop hop-count的配置,下列哪项说法是正确的? hop-count必须大于2 hop-count…

8条黄金准则,解决API安全问题

API(应用程序编程接口)是现代软件开发中不可或缺的一部分。它们允许不同的应用程序之间共享数据和功能,从而促进了软件系统的整合和互操作性。然而,随着API使用的普及,安全性问题也开始浮出水面。 API安全是指保护API免…

Windows 剪映专业版 v5.9.0 解锁VIP、解除限制功能!

介绍 该脚本具备多项高级功能,包括人像抠图、会员专属模板、超清画质以及素材预设。会员可使用的功能均通过此脚本解锁。 解锁剪映软件会员功能,包括人像抠图、会员模板、超清画质以及素材预设等。 在标准操作流程中,用户首先在电脑端启动…

系统架构设计师【第12章】: 信息系统架构设计理论与实践 (核心总结)

文章目录 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企业信息系…

大模型应用:Prompt-Engineering优化原则

1.Prompt-Engineering 随着大模型的出现及应用,出现了一门新兴“技术”,该技术被称为Prompt-Enginerring。Prompt Engineering即提示工程,是指在使用大语言模型时,编写高效、准确的Prompt(提示词)的过程。通过不同的表述、细节和…

【JavaEE 进阶(二)】Spring MVC(下)

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多进阶知识 目录 1.前言2.响应2.1返回静态界面2.2返回数据2.3返回HTML代码 3.综合练习3.1计算器3.2用户登…

ROS简介

ROS概念 学习路线 操作系统 Linux环境下编译执行c文件(需安装vim超文本编辑器) sudo g MyCoding.cpp -o CodeTest //生成一个名字为CodeTest的可执行文件 sudo ./CodeTest //执行c文件版本问题 ROS Melodic Morenia 和 ROS Noetic Ninjemys 是…

基于Django的博客系统之登录增加忘记密码(八)

需求 描述: 用户忘记密码时,提供一种重置密码的方法,以便重新获得账户访问权限。规划: 创建一个包含邮箱输入字段的表单,用于接收用户的重置密码请求。用户输入注册时使用的邮箱地址,系统发送包含重置密码…

CTF本地靶场搭建——基于阿里云ACR实现动态flag题型的创建

接上文,这篇主要是结合阿里云ACR来实现动态flag题型的创建。 这里顺便也介绍一下阿里云的ACR服务。 阿里云容器镜像服务(简称 ACR)是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。 ACR 支持全球同步加速、…

如何恢复 Android 设备上丢失的照片

由于我们的大量数据和日常生活都存储在一台设备上,因此有时将所有照片本地存储在 Android 智能手机或平板电脑上可能是一种冒险行为。无论是由于意外(损坏、无意删除),还是您认识的人翻看您的设备并故意删除了您想要保留的照片&am…

从0开始学统计-什么是回归?

1.什么是回归? 回归(Regression)是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量(输入变量)与因变量(输出变量)之间的关系。在回归分析中,我们尝试根…

【Leetcode笔记】40.组合总和II

1. 题目要求 这道题目和39.组合总和不一样的地方在于:数组中含有相同的元素。同样地,结果不能含有重复组合。 拿第一个示例来看, candidates [1, 1, 2, 5, 6, 7, 10]问题在于:第一个path[1(index 0), 2],绝不能出现…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型,在新模型发布时都会给出很多评测数据,用以说明当前模型在不同数据集上的测评表现(如下面llama3发布的评测数据)。 这些评测数据是如何给出来的呢?这篇文章会用一个最小化的流程来还原下…

echarts绘制三维柱状图

echarts ECharts 是一个使用 JavaScript 实现的开源可视化库,主要用于数据的可视化展示。ECharts 支持丰富的图表类型,如折线图、柱状图、饼图、地图、K线图等,可以满足不同类型数据的展示需求。 文档地址:echarts 本次所绘制三…

从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

注意: 1. 我们要实现自发自收,要将tx,rx连起来 2.发送的 不能是中文符号,因为这可能导致,读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致 3.注意同时定义两个槽函数的时候两个槽函数都会被调用,…

MySQL数据表的设计

实际工程中, 对于数据表的设计和创建, 我们遵循以下步骤: 首先确定实体, 找到关键名词, 提取关键信息, 设计表有哪些列, 每一列是什么. (有几个实体, 一般就创建几个表, 一般一个表对应一个实体) 实体之间的关系: 1. 一对一关系 例如: 一个学生, 只能有一个账号; 一个账号只…

基于单片机的病床呼叫系统设计研究

摘要:随着无线技术的快速发展,无线应用技术已经运用到人们生产生活中的多个领域,运用无线技术来设计病床呼叫系统能够实现无线信号的远距离传输,减少材料耗费,使医患之间的沟通更加便捷,该系统运用单片机作…