C语言详解文件操作

目录

什么是文件?


为什么使用文件?


程序文件和数据文件、文本文件和二进制文件

1.程序文件和数据文件

1.1程序文件

1.2数据文件

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


文件的打开和关闭(流、标准流、文件指针和文件的打开与关闭)

1.流和标准流

1.1:流

1.2:标准流

2.文件指针

3.文件的打开和关闭

例:"w"——只写(从文件输出数据)

关闭文件


文件的顺序读写和随机读写

1.文件的顺序读写

1.1:顺序读写的函数介绍

1.2:fputc函数

1.3:fgetc函数

1.4:fputs和fgets函数

对比三组函数

2.文件的随机读写

2.1:fseek

2.2:ftell 

2.3:rewind


文件读取结束的判定

1.feof

2.文件读取结束的判定


文件缓冲区


什么是文件?

磁盘(硬盘)上的文件是文件。

可能有点抽象,举个例子,如图:

图中所有的文件包括文件夹都是文件。

而为了使用文件,自然也需要文件名来让我们进行识别和引用。

文件名包含三部分:文件路径 + 文件名主干 + 文件后缀

例如:c:\code\test.txt

为什么使用文件?

首先要知道,我们写的程序的数据是存储在电脑的内存中的,如果没有文件,程序退出内存回收,数据就丢失了,等再次运行程序就无法看到上次程序的数据。

文件可以将数据进行持久化保存

因此如果要将数据进行持久化的保存,我们可以使用文件。

程序文件和数据文件、文本文件和二进制文件

1.程序文件和数据文件

在程序设计中,我们一般谈的文件有两种(从文件功能的角度来分类的):程序文件和数据文件

1.1程序文件

程序文件(按我的理解)口语化一点的讲就是我们写的代码那些所产生的文件。——

比如我们写代码就是在.c文件写的,编译后产生的就是.obj(目标)文件,链接后就是.exe文件。

都是我们编写的代码所产生的文件(或者在文件中编写的代码)

程序文件包括源程序文件(后缀为.c)目标文件(windows环境后缀为.obj)可执行程序(windows环境后缀为.exe)

1.2数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

我们之前基本都是以程序文件的形式运行代码的,而本章主要讨论的就是数据文件了。

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

根据数据的组织形式(按内容分),数据文件又被称为文本文件二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中(也就是直接输出了),就是二进制文件

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

文件的打开和关闭(流、标准流、文件指针和文件的打开与关闭)

1.流和标准流

1.1:流

当我们写个程序要输出到外部设备上,或者要从外部设备读取数据时,外部设备不同,输入输出操作自然也可能不同,因此为了方便我们操作,就产生了流。

C程序针对文件、画面、键盘等的数据输入输出都是通过对流操作的。

我们可以把流当作中介,一般当我们要向流里写数据,或者从流中读取数据时,都是打开流然后进行操作。

有小伙伴可能会问了,我们这题目明明是“题目的打开和关闭”,为什么要突然讲流和标准流呢?

其实不难想到,文件我们上文讲过是用来将数据进行持久化保存的——也就是说,文件里面放的也是数据,而文件的打开和关闭即文件的使用文件的使用不管是读取还是输出数据,都要经过我们的流来进行数据的输入输出,因此流是我们学习文件使用的基础,所以先对流进行讲解,下文中的标准流、文件指针等也是同理。

1.2:标准流

我们上文中讲了“C程序针对文件、画面、键盘等的数据输入输出都是通过对流操作的。”,可我们从键盘输入数据并从屏幕上输出数据时并没有打开流,直接使用scanf、printf等函数就可以直接进行输入输出操作了,这是为什么呢?——

这都是因为C程序在启动时已经默认打开了三个流

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

stdin、stdout和stderr三个流的类型都是:FILE*,通常称为文件指针

C语言中,就是通过FILE* 的文件指针来维护流的各种操作的。

2.文件指针

其实是叫“文件类型指针”,简称文件指针

文件存放着数据,文件被使用时本身也是数据,因此被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件名、文件位置等)。

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

如下图:

一般都是通过一个FILE的指针来维护这个FILE结构的变量。(也就是通过一个指向FILE的指针来对与FILE有关联的文件进行访问)。

3.文件的打开和关闭

当我们开始对文件打开与关闭时应该就是要使用(读写)我们的文件了——使用文件的步骤可以分三步:

  1. 打开文件(其实就是打开流)
  2. 读/写文件
  3. 关闭文件(其实就是关闭流)

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

如图分别为在cplusplus中找到的两个函数的介绍:

在编写程序的时候,打开文件的同时都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。如图:

mode表示文件的打开方式(即读/写/······)。下面都是文件的打开方式:

例:"w"——只写(从文件输出数据)

假设我们此时要写一个文件test.txt,如图:

但此时我们的文件夹并没有text.txt这个文件,此时的文件夹如下图:

但是当我们运行代码后,就在文件夹中产生了一个text.txt文件,如下图示:

关闭文件

前文有讲过:我们关闭文件要用fclose函数,但是关闭后我们还需要手动置为空指针

如图:

此时我们经过调试,可以看到,指针pf经fclose函数关闭后,还是有地址,只是不指向文件了,因此此时的pf指针是野指针,所以我们要手动将其置空指针。

文件的顺序读写和随机读写

1.文件的顺序读写
1.1:顺序读写的函数介绍

顺序读写的函数介绍如下图:​​​​​​​

上图中的适用于所有输入流一般指的是适用与标准输入流和其他输入流(如文件输入流),

适用于所有输出流也同理(标准输出和其他输出)。

1.2:fputc函数

由上图我们可以知道,fputc为字符输出函数,函数形式如下(函数的具体功能可以自行前往fputc - C++ Reference (cplusplus.com) 查看):​​​​​​​

函数有了解之后我们就接着按三板斧来进行实现了,函数实现如下:

int main()
{
	//1.打开文件
	FILE* pf = fopen("text.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}

	//2.使用(写)文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	fputc('e', pf);

	//3.关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行后我们就已经将abcde写入了文件text.txt中。

原本该文件是我们在上文中新建的内容为空,此时内容为"abcde"如下图所示:

1.3:fgetc函数

fgetc为字符输入函数,函数形式如下:

函数实现效果如下:

因为上文中我们已经往文件text.txt中写入了abcde,因此现在读四次读出来的是abcd。

1.4:fputs和fgets函数

这两个函数和上文刚刚讲的fputc和fgetc函数类似,此处就直接举例说明(fputs函数)了,如图:

如上图,fputs是进行写字符串操作的,将字符串写入pf指向的内容(此图指向的为text.txt文件中)

但是写字符串是连续的,如果希望换行需要自己在字符串末尾加\n.

fgets函数就相对复杂一点点,函数形式如下图:

此时我们text.txt文档内的放置内容为abcdef

fgets示例如下:



对比三组函数

scanf/printf —— 针对标准输入/输出流的 格式化 输入/输出函数

fscanf/fprintf —— 针对所有输入/输出流的 格式化 输入/输出函数

sscanf/sprintf —— 从字符串中读取格式化的数据 / 将格式化的数据写到字符串中



后面的四个函数就不过多赘述了,详细功能可以自行在cplusplus网址

(Reference - C++ Reference (cplusplus.com))中查找

2.文件的随机读写
2.1:fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)

文件的第三个参数(起始位置)如下:

示例:

int main()
{
	//1.打开文件
	FILE* pf = fopen("text.txt", "wb");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}

	//2.使用(写)文件
	fputs("This is an apple.", pf);
	fseek(pf, 9, SEEK_SET);
	fputs(" sam", pf);

	//3.关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

2.2:ftell 

返回文件指针相较于起始位置的偏移量,形式如下:

这个就比较好理解了,我们直接上示例:

2.3:rewind

让文件指针的位置回到起点位置,形式如下:

我们在上图示例代码的基础上,再加入rewind观察,如下图所示:

文件读取结束的判定

1.feof

在文件读取过程中,不能用feof直接判断文件读取是否结束

feof是在当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束(也就是是否是正常读完的)。

2.文件读取结束的判定
  • 判定文本文件读取是否结束时

判断返回值是否为EOF(fgetc),

或NULL(fgets)。

  • 判定二进制文件时

判定返回值是否小于实际要读的个数(fread)。

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理数据文件的,

缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。

从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

缓冲区的大小时根据C编译系统决定的。

图示如下:

正是因为缓冲区的存在,所以我们在文件操作结束后才需要关闭文件,如果没有关闭可能导致读写文件的问题。



创作不易,如果觉得作者写的还行的话给个免费的三连吧亲🌹🌹

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

了解常用智能指针

智能指针 1、概念 C中引入智能指针的主要目的是为了解决内存管理的问题,传统的指针(裸指针)在使用时需要手动分配和释放内存,容易出现内存泄漏和悬挂指针等问题。智能指针通过封装裸指针,并提供自动内存管理功能&…

Python私教张大鹏 Vue3整合Vue Router之编程式导航

除了使用 <router-link> 创建 a 标签来定义导航链接&#xff0c;我们还可以借助 router 的实例方法&#xff0c;通过编写代码来实现。 导航到不同的位置 注意: 下面的示例中的 router 指代路由器实例。在组件内部&#xff0c;你可以使用 $router 属性访问路由&#xff…

spool 管道 小文件 mknod

Spool File In SQL*PLUS in Multiple Small Files ? (Doc ID 2152654.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 12.1.0.2 [Release 10.2 to 12.1] Oracle Database Cloud Schema Service…

城镇污水处理设施运维服务认证

初次申请认证时需提交的文件/资料 1、通用文件/资料(证明文件复印件需签字盖公章) ☐ 营业执照复印件、统一社会信用代码/组织机构代码证复印件 ☐ 增值税一般纳税人资格证复印件&#xff0c;或其他增值税一般纳税人资格认定文件复印件 ☐ 资质 或 许可证 复印件&#x…

DNS协议 | NAT技术 | 代理服务器

目录 一、DNS协议 1、DNS背景 2、DNS协议 域名 域名解析 二、NAT技术 1、NAT技术 2、NAPT技术 3、NAT技术的缺陷 三、代理服务器 1、正向代理服务器 2、反向代理服务器 一、DNS协议 域名系统&#xff08;Domain Name System&#xff0c;缩写&#xff1a;DNS&#…

Vue TypeScript 实战:掌握静态类型编程

title: Vue TypeScript 实战&#xff1a;掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境下为Vue.js应用搭建项目结构&#xff0c;包括初始化配置、创建Vue组件、实现状态管理利用Vuex、配置路由以及性能优化的方法&#x…

vue2自定义指令

本节目标 快速入门v-loading 快速入门 指令对比 基本语法 使用: v-指令名"指令值"定义: 通过 directives 局部定义或者全局定义通过事件对象 el 可以拿到指令所在元素通过形参 binding 可以拿到指令的传值通过update钩子, 可以监听指令值的变化,进行更新操作 局部…

2024浙江省三支一扶报名流程!超详细图解!

2024浙江省三支一扶报名流程&#xff01;超详细图解&#xff01; 浙江省高校毕业生“三支一扶”报名即将开始&#xff0c;准备报考的同学们做好准备&#xff1a; &#x1f534;重点时间安排&#xff1a; 1、网络报名&#xff1a;6月11日9:00至6月18日17:00 2、资格审核&…

速卖通店铺防关联该怎么做?

大家都知道&#xff0c;想要进行多账号操作必须一再小心&#xff0c;否则会有很大的关联风险&#xff0c;而账号关联所带来的后果是卖家绝对不能轻视的&#xff0c;严重的话会导致封号&#xff0c;这样一来自己前期的辛苦运营就全都打水漂了&#xff0c;因此防关联很重要&#…

C++对象池设计与实现

目录 一、对象池简介 1.1 池化技术 1.2 什么是对象池 1.3 对象池分配策略 二、C new和delete运算符重载 三、实现一个对象池框架 3.1 策略接口 四、实现几种对象池的分配策略 4.1 数组策略 4.2 堆策略 ​编辑 4.3 栈策略 4.4 区块策略 一、对象池简介 1.1 池化技…

【C语言】插入排序(经典算法,建议收藏!!!)

目录 1、原理2、代码展示3、解析代码4、适用场景 1、原理 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;其原理可以简述如下&#xff1a; 1.分已排序区间和未排序区间: 将数组分为已排序区间和未排序区间。初始时&#xff0c;已排序区…

51单片机-独立按键控制灯灯灯

目录 简介: 一. 1个独立按钮控制一个灯例子 二. 在加一个独立按键,控制第二个灯 三. 第一个开关 开灯, 第二个开关关灯 四. 点一下开灯,在点一下关灯 五. 总结 简介: 51 单片机具有强大的控制能力&#xff0c;而独立按键则提供了一种简单的输入方式。 当把独立按键与 …

Vue 2看这篇就够了

Vue 2 技术文档 Vue.js 是一款用于构建用户界面的渐进式框架。与其他重量级框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。而 Vue.js 2&#xff08;以下简称 Vue…

Leetcode 力扣113. 路径总和 II (抖音号:708231408)

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

【设计模式】结构型-桥接模式

当抽象与实现&#xff0c;各自独立&#xff0c; 桥接模式&#xff0c;如彩虹桥&#xff0c;连接两岸。 文章目录 一、类爆炸与代码重复二、桥接模式三、桥接模式的核心组成四、运用桥接模式五、桥接模式的应用场景六、小结推荐阅读 一、类爆炸与代码重复 场景假设&#xff1a…

标量、向量、矩阵、张量是什么?

参考视频&#xff1a;标量、向量、矩阵、张量-机器学习-李文哲AI人工智能培训_哔哩哔哩_bilibili 参考资料&#xff1a;深度学习基础&#xff1a;标量、向量、矩阵、张量_深度学习本质是矩阵-CSDN博客 标量是一个独立存在的数&#xff0c;比如线性代数中的一个实数5就可以被看…

每日一题——Python实现PAT乙级1019 数字黑洞(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 点评代码的优缺点&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#…

DAMA学习笔记(一)-数据管理

1.引言 数据管理(Data Management) 是为了 交付、 控制、 保护 并 提升 数据和信息资产的 价值 , 在其整个生命周期中制订 计划、 制度、 规程和实践 活动, 并 执行 和 监督 的过程。 数据管理专业人员(Data Management Professional) 是指 从事数据管理各方面的工作…

Cinema 4D 2024 软件安装教程、附安装包下载

Cinema 4D 2024 Cinema 4D&#xff08;C4D&#xff09;是一款由Maxon开发的三维建模、动画和渲染软件&#xff0c;广泛用于电影制作、广告、游戏开发、视觉效果等领域。Cinema 4D允许用户创建复杂的三维模型&#xff0c;包括角色、场景、物体等。它提供了多种建模工具&#x…

Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践

背景 Apache Flink 是一个开源的流处理和批处理框架&#xff0c;具有高吞吐量、低延迟的流式引擎&#xff0c;支持事件时间处理和状态管理&#xff0c;以及确保在机器故障时的容错性和一次性语义。Flink 的核心是一个分布式流数据处理引擎&#xff0c;支持 Java、Scala、Pytho…