C语言详解文件操作

news2024/9/20 6:40:58

目录

什么是文件?


为什么使用文件?


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

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编译系统决定的。

图示如下:

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



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

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

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

相关文章

体素技术在AI绘画中的革新作用

随着人工智能技术的不断进步,AI绘画已经成为艺术创作和视觉设计领域的一大趋势。在众多推动AI绘画发展的技术中,体素技术以其独特的优势,正在逐渐改变着我们对计算机生成图像的认识。本文旨在探讨体素技术在AI绘画中的应用与影响,…

电脑存储设备,固态硬盘介绍,usb接口

简介 存储设备分为两大类主存和辅存,另外还有专门提供存储服务的网络存储 主存储器 随机存取存储器(RAM, Random Access Memory) 特点:高速、易失性存储器,断电后数据丢失。用途:临时存储正在使用的数据…

超详解——python数字和运算——基础篇

目录 1.位运算 2. 常用内置函数/模块 math模块: random模块: decimal模块: 3.内置函数: 总结: 1.位运算 位运算是对整数在内存中的二进制表示进行操作。Python支持以下常见的位运算符: 按位与&…

adb shell进入设备后的命令

目录 一、查看删除手机 /data/local/tmp/下的文件 二、设置权限 三、查看手机设备正在运行的服务 四、可能需要的adb 命令 一、查看删除手机 /data/local/tmp/下的文件 可以通过以下命令: adb shell # 进入设备 ls /data/local/tmp/ # 查看文件夹下的内容…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《计及电力不平衡风险的配电网分区协同规划》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

基于小波的多元信号降噪-基于马氏距离和EDF统计(MATLAB R2018a)

马氏距离是度量学习中一种常用的距离指标,通常被用作评定数据样本间的相似度,可以应对高维线性分布数据中各维度间非独立同分布的问题,计算方法如下。 (1)计算样本向量的平均值。 (2)计算样本向…

【数据结构】【版本1.0】【线性时代】——顺序表

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、顺序表的概念1.1 最基础的数据结构:数组1.2 数组与顺序表的区别 二、静态顺序表三、动态…

HTML做成一个粒子漩涡特效页面

大家好,今天制作制作一个粒子漩涡特效的页面! 先看具体效果: 要在一个单一的 index.html 页面中实现粒子漩涡特效,我们可以使用HTML、CSS和JavaScript(不需要外部库)。下面是一个简单的例子,展…

探索基于订阅式的电视App:Android TV 端强大的开源视频播放器

探索基于订阅式的电视App:Android TV 端强大的开源视频播放器 在智能电视和流媒体日益普及的今天,一款强大的视频播放器是家庭娱乐的重要组成部分。正是这样一款为Android TV设计的开源视频播放器。本文将深入探讨电视盒子OSC的技术特点、使用方法以及其…

直接用sql语句来查询和分析excel表,不需要导数据,提供了sql语句自动生成,不会sql也能用

用sql语句来查询excel表,我们需要把excel表格导入到数据库中,然后用数据库的管理工具写sql语句来进行查询。方法有很多,我们不一一描述。 今天我们要说的是直接用sql语句来查询和分析excel表。为什么有这么一个想法呢?程…

unity基础(五)地形详解

目录 一 创建地形 二 调整地形大小 三 创建相邻地形 四 创建山峰 五 创建树木 七 添加风 八 添加水 简介: Unity 中的基础地形是构建虚拟场景的重要元素之一。 它提供了一种直观且灵活的方式来创建各种地形地貌,如山脉、平原、山谷等。 通过 Unity 的地形…

FuTalk设计周刊-Vol.039

🔥AI漫谈 热点捕手 1、AI视频生成工具大PK | Runway Gen-2、Pika、Moonvalley和W.A.L.T的文字生视频对比评测 AI届的学术大牛李飞飞最近推出了用于生成逼真视频的扩散模型W.A.L.T。效果很不错,不过目前还未开放公网的访问。于是我萌生了一个想法&#…

总结【GetHub的WebAPI,ASSET_ID】,【Linux的jq命令】(草稿版+实际操作)

目录 1.介绍一下github中的 asset_id 2. GitHub 的 asset_id相关操作 2.1.获取特定 repository 的 release 列表: 2.2.获取特定 release 中的 asset 列表,并找到 asset_id: 2.3.使用ASSET_ID获取资材 3.返回的 assets 的信息 是什么样样…

Golang-编码加密-Xor(GG)

go语言环境搭建 Golang学习日志 ━━ 下载及安装_golang下载-CSDN博客 go run xxx.go go build xxx.go 首先,cs.msf生成比特流数据. 放入xor,py脚本中进行xor加密. xor.py def xor(shellcode, key):new_shellcode ""key_len len(key)# 对shellcode的每一位进行…

再次修改了备忘录

Control <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>与妖为邻备忘录</title><!-- <…

ffmpeg视频解码原理和实战-(5)硬件加速解码后进行渲染并输出帧率

头文件&#xff1a; xvideoview.h #ifndef XVIDEO_VIEW_H #define XVIDEO_VIEW_H #include <mutex> #include <fstream> struct AVFrame;void MSleep(unsigned int ms);//获取当前时间戳 毫秒 long long NowMs();/// 视频渲染接口类 /// 隐藏SDL实现 /// 渲染方案…

【Redis学习笔记06】Jedis客户端(下)

Jedis客户端 1. 命令 1.1 Hash类型 Hash类型相信大家并不陌生&#xff0c;许多编程语言都有对应数据结构的实现&#xff0c;可能叫做哈希、字典、映射、关联数组&#xff0c;是相当重要的&#xff01; 在实际开发中非常常用在面试中也是高频考点 1.1.1 常见命令 HSET命令…

Django API开发实战:前后端分离、Restful风格与DRF序列化器详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

NLP实战入门——文本分类任务(TextRNN,TextCNN,TextRNN_Att,TextRCNN,FastText,DPCNN,BERT,ERNIE)

本文参考自https://github.com/649453932/Chinese-Text-Classification-Pytorch?tabreadme-ov-file&#xff0c;https://github.com/leerumor/nlp_tutorial?tabreadme-ov-file&#xff0c;https://zhuanlan.zhihu.com/p/73176084&#xff0c;是为了进行NLP的一些典型模型的总…