用C语言了解文件那些下 ‘流‘ 事

  • 本篇会加入个人的所谓‘鱼式疯言’
  • ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的,可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念
    在这里插入图片描述

前言

💕💕💕艾迪巴帝,友子们,今天我们将推开 文件操作 的大门
主要讲的有:

  1. ⽂件的引入?
  2. ⼆进制⽂件和⽂本⽂件?
  3. ⽂件的打开和关闭
  4. ⽂件的顺序读写
    💖💖💖

一.文件的引入

1.为什么要使用文件?

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中
如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的
如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件。

2. 什么是文件

磁盘上的⽂件是⽂件。
但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)

2.1 程序文件

程序⽂件包括源程序⽂件(后缀为 .c
⽬标⽂件(windows环境后缀为 .obj
可执⾏程序(windows环境后缀为 .exe)。

2.2 数据⽂件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,
⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。

本章讨论的是数据⽂件。

在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到 显⽰器上。

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件.

2.3 文件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
为了⽅便起⻅,⽂件标识 常被称为 ⽂件名

鱼式疯言
就是说呢😊😊😊
我们文件时在磁盘上的,用来存储数据的,文件可以放程序也可以放数据,我们可以在终端(下面第一张的小黑框框),也可以在我们下面磁盘上处理(下面第二张文件路径图)
(1).
在这里插入图片描述
(2).
在这里插入图片描述

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

根据数据的组织形式,数据⽂件被称为⽂本⽂件 或者⼆进制⽂件
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
⼀个数据在内存中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
在这里插入图片描述

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节

 #include <stdio.h>
int main()
{
	int a = 10000;
	 FILE * pf = fopen("test.txt", "wb");
	fwrite(&a, 4, 1, pf);
	//⼆进制的形式写到⽂件中 
	fclose(pf);
	pf = NULL;  
	return 0;
}

在这里插入图片描述
文本文件是不打开的哦❤️❤️❤️
那该怎么办呢?
请宝子们看下面分解
在这里插入图片描述

4.文件打开和关闭

4.1流和标准流

<1> 流

我们程序的数据需要输出到各种外部设备
也需要从外部设备获取数据
不同的外部设备的输⼊输出 操作各不相同
为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了 的概念,我们可以把流 想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开 ,然后操作。
在这里插入图片描述

<2> 标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢? 那是因为C语⾔程序在启动的时候,默认打开了3个流:

• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。

• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。

• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

<3> 标准流的栗子🌰

#include<stdio.h>
int main()
{
	char arr[10]="abcdefg\n";
	fprintf(stdout,arr);
	//用 fprintf 标准输出流输出
	printf(arr);
	//普通的 printf 输出
}

在这里插入图片描述

鱼式疯言

其实,在我们的运行程序时

我们的编译器就会在底层运行用到我们这三个标准流

输入输出错误

小伙伴了解一下即可,不需要深入研究

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

stdin、stdout、stderr 三个流的类型是:
FILE* ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

鱼式疯言

啥是 呢?

说白了,就是一个中介,一个中转站,一个快递员,一个转换器,一个中枢枢纽…

上面我们提及了一个陌生的概念,文件指针
这是什么呢?
不妨小伙伴都和我一起继续往下找找答案吧😊😊😊

4.2 文件指针

缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。 每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。
这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE
例如,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;

不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。 每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信 息,使⽤者不必关⼼细节。 ⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。 下⾯我们可以创建⼀个FILE*的指针变量:

FILE* pf;
//⽂件指针变量

这上面的概念友友们小小过过眼,知道这个概念就欧克啦
咱们主要的是知道并掌握文件指针的使用 ! ! !
定义pf是⼀个指向FILE类型数据的指针变量。
可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变 量)。
通过该⽂件信息区中的信息就能够访问该⽂件。
在这里插入图片描述

鱼式疯言

通过⽂件指针变量能够间接找到与它关联的⽂件.

在这里插入图片描述

接下来,该我们实操起来啦💕💕💕

4.3 文件的打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个 FILE* 的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

在这里插入图片描述

mode 表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:

在这里插入图片描述
友子们是不是都不想看了,我也是😭😭😭
太多了吧,不过我们只需要会前面的 **“r”**和 **“w”**就足够啦!

4.3.1 “w” 的栗子说明

在这里插入图片描述

/* fopen fclose example */
#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开⽂件
	pFile = fopen("myfile.txt", "w");
	//⽂件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//关闭⽂件
		fclose(pFile);
	}
	return 0;
}

在这里插入图片描述
鱼式疯言:

有该文件我们可以用 “w” 自行打开,

如果没有该文件的话,我们就可以通过 “w” 自动创建

具体对文件的流程就是

打开文件——>文件操作——>关闭文件.

4.3.2 “r” 的栗子说明

在这里插入图片描述

就像上面这样要是没有该文件的情况,
如果我们用 “r” 来实践呢!!!

/* fopen fclose example */
#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开⽂件
	pFile = fopen("myfile.txt", "r");
	//⽂件操作
	if (pFile == NULL)
	{
		perror("fopen");
		return 1;
	}
	//关闭⽂件
	fclose(pFile);
	return 0;
}

在这里插入图片描述
小伙伴都看清楚区别了吧 “w” 和 “r”的区别吧😁😁😁

鱼式疯言

我是这样理解的
w—> write 是写的意思吧,如果我们要写,当我们该文件名时,是不是可以先创个文件再写呢 ! ! !
r——> read 是读的意思呢,如果我们要读,那如果也没有该文件名呢,连个文件都没有肯定会报错呢! ! !
如果都有该文件名,这样我们就可以用下面的顺序读写函数对文件进行操作了。💖💖💖

5.文件的顺序读写

5.1 顺序读写函数介绍

在这里插入图片描述
蛙趣,好多啊😣😣😣
没关系,下面由小编来带着大家一起学
咱们两两搭配起来用哦💖💖💖

5.2 fgetc 与 fputc

/*fputc与fgetc_test*/

#include<stdio.h>
int main()
{
	FILE* putpile = fopen("gt.txt", "w");
	if (putpile == NULL)
	{
		perror("fopen->putpile");
		return 1;
	} 
	for (int i = 0; i < 26; i++)
	{
		fputc('a' + i, putpile);
	}
	fclose(putpile);
	putpile = NULL;
	//这里一定要要指针置为空
	//否则就有可能出差错
	FILE* getpile = fopen("gt.txt", "r");
	if (getpile == NULL)
	{
		perror("fopen->getpile");
		return 1;
	}
	int ch = fgetc(getpile);
	printf("%c\n", ch);

	ch = fgetc(getpile);
	printf("%c\n", ch);

	ch = fgetc(getpile);
	printf("%c\n", ch);

	ch = fgetc(getpile);
	printf("%c\n", ch);

	//for (int i = 0; i < 4; i++)
	//{
	//	printf("%c\n", fgetc(getpile));
	//}
	//也可用循环打印
	fclose(getpile);
	getpile = NULL;
	//最后要关闭文件指针哦
	return 0;
}

在这里插入图片描述
根据上面的代码,我们就可以对文本进行 啦 !!!

5.3 fgets 与 fputs

在这里插入图片描述

<1>.举个栗子

#include<stdio.h>
int main()
{
	FILE* putpile = fopen("gt.txt", "w");
	if (putpile==NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcde", putpile);
	fclose(putpile);
	putpile = NULL;
	FILE* getpile = fopen("gt.txt", "r");
	if (getpile==NULL)
	{
		perror(fopen);
		return 1;
	}
	char arr[5];
	fgets(arr,4, getpile); 
	printf(arr);
	fclose(getpile);
	getpile = NULL;
	return 0;
}

在这里插入图片描述

鱼式疯言

唯一要注意一点是:

num : 这里是要指定输出字符串大小的

5.3. fprintf 与 fscanf

在这里插入图片描述

<1>.举个栗子

struct Stu
{
	char name[20];
	int age;
	float score;
};
#include<stdio.h>
//fprintf与fscanf_test
int main()
{
	struct Stu s1 = { "hehehhhh" ,112, 12.366 };
	struct Stu s2 = {0};
	FILE* pc = fopen("gt.txt", "w");
	if (pc==NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(pc, "%s %d %.1f", s1.name, s1.age, s1.score);
	//fprintf 可以用于写文件
	fclose(pc);
	pc = NULL;
	FILE* pf = fopen("gt.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写读文件
	//
	fscanf(pf, "%s %d %f", s1.name, &(s1.age), &(s1.score));
	//写出该文件的内容拷贝在结构体 s 上
	fprintf(stdout, "%s %d %.1f\n", s1.name, s1.age, s1.score);
	//读取或输出该结构体
	printf("%s %d %.1f\n", s1.name, s1.age, s1.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

w方式时,我们用 fprintf 可以写入
r方式时,我们可以通过 fscanf 从文本中传出数据到结构体
再通过标准输出流 stdout 打印我们的或者 printf 直接输出

5.4. fwrite 和 fread

在这里插入图片描述

<1>. fwrite 的栗子

  //fwrite
#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s = {"zhangsan", 20, 90.5};
	FILE* pf = fopen("data.txt", "wb");
	if (pf == NULL)
	{
		return 1;
	}
	//二进制的形式写文件
	fwrite(&s, sizeof(s), 1, pf);
	
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
在这里插入图片描述

前面我们看到fprintf写进去的文本,
下面小伙伴来看看这两者的区别
在这里插入图片描述

<2>. fread 的栗子

#include<stdio.h>
//fread_test
struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s = { 0 };
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		return 1;
	}
	//二进制的形式读文件
	fread(&s, sizeof(s), 1, pf);
	printf("%s %d %.1f\n", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
上面我们讲到了二进制文件在文本文件中是会变乱的
但我们的读取还是一样的读取

鱼式疯言

这点充分说明了,文件的种类虽然不同,形式发生了改变 ,但是文件的内容一般不会改变.

以上顺序读写函数的操作,啥叫 顺序读写 呢🤔🤔🤔
显而易见 顺序 顺序 就是当相当于我们C语言程序自上而下的顺序执行一样,后期我们会进一步讲解我们的文件随机读写,文件读取的判定和文件缓冲区的讲解…

友友们敬请期待哦 !!!

总结
🤞🤞🤞在本篇文章中,我们主要讲解有

  • ⽂件的引入的概念,类别!
  • ⼆进制⽂件和⽂本⽂件的认识
  • .文件指针的理解,以及利用函数对⽂件的打开和关闭
  • ⽂件的顺序读写,不同文件操作函数的理解以及实际操作文本文件和二进制文件。

💖💖💖本次博文就到这里了,感觉各位小伙伴的赏脸品读小编写的拙作哦,

如果觉得小编写的还不错的咱可支持三关下,不妥当的咱评论区指正

希望我的文章能给各位家人们带来哪怕一点点的收获就是小编创作的最大动力💖💖💖

在这里插入图片描述

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

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

相关文章

AMEYA360:大唐恩智浦荣获 2023芯向亦庄 “汽车芯片50强”

2023年11月28日&#xff0c;由北京市科学技术委员会和北京市经济和信息化局指导、北京经济技术开发区管理委员会主办、盖世汽车协办的“芯向亦庄”汽车芯片大赛在北京亦庄成功闭幕。 在本次大赛中 大唐恩智浦的 电池管理芯片DNB1168 (应用于新能源汽车BMS系统) 凭卓越的性能及高…

PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为 Excel

PDF是一种通用的文件格式&#xff0c;但它很难编辑。如果您想修改和计算PDF数据&#xff0c;将PDF转换为Excel将是一个理想的解决方案。在本文中&#xff0c;您将了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中将 PDF 转换为 Excel。 Spire.Doc 是一款专门对 Word 文档进行…

医疗设备智慧管理助力医院提质增效,阿基米德amp;健康界实践分享

近日&#xff0c;苏州阿基米德网络科技有限公司与医疗领域头部级媒体健康界&#xff0c;联合举办“数智为擎 提质增效——医学装备智慧管理创新发展论坛”的直播活动。 直播现场&#xff0c;来自上海交通大学医学院附属同仁医院、中华医学会航海医学分会、苏州阿基米德的专家们…

vscode报错:建立连接:XHR failed

文章目录 问题解决方案 问题 Windows端ssh远程连接Linux端&#xff0c;Windows端vscode报错&#xff1a;“…XHR failed.” 解决方案 参考&#xff1a;解决 Windows 端 VS Code “无法与 “…“ 建立连接&#xff1a;XHR failed.” 问题 亲测有效。 总结&#xff1a; linux…

如何在小米路由器4A千兆版刷入OpenWRT并通过内网穿透工具实现公网远程访问

文章目录 前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 前言 OpenWRT是一个高度模块化、高度自…

代码随想录二刷 |二叉树 |144.二叉树的前序遍历

代码随想录二刷 &#xff5c;二叉树 &#xff5c;144.二叉树的前序遍历 题目描述解题思路代码实现递归法迭代法 题目描述 144.二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输…

使用Sourcetrail解析C项目

阅读源码的工具很多&#xff0c;今天给大家推荐一款别具一格的源码阅读神器。 它就是 Sourcetrail&#xff0c;一个免费开源、跨平台的可视化源码探索项目 使用

Python+Appium自动化测试之元素等待方法与重新封装元素定位方法

在appium自动化测试脚本运行的过程中&#xff0c;因为网络不稳定、测试机或模拟器卡顿等原因&#xff0c;有时候会出现页面元素加载超时元素定位失败的情况&#xff0c;但实际这又不是bug&#xff0c;只是元素加载较慢&#xff0c;这个时候我们就会使用元素等待的方法来避免这种…

前端知识(十三)——JavaScript监听按键,禁止F12,禁止右键,禁止保存网页【Ctrl+s】等操作

禁止右键 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右键禁止按键 // 监听按键 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…

设计模式-门面模式(Facade)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、定义二、结构 前言 在组件构建过程中&#xff0c;某些接口之间直接依赖会带来很多问题&#xff0c;甚至无法直接实现。采用一层间接接口&#xff0c;来隔离…

低代码开发:属于“美味膳食”还是“垃圾食品”

目录 引言低代码是什么&#xff1f;低代码的优点使用挑战未来展望最后 引言 随着数字化转型的迅猛发展&#xff0c;低代码开发平台逐渐成为了企业和开发者的关注焦点&#xff0c;尤其是前两年低代码的迅速火爆&#xff0c;来势汹汹&#xff0c;号称要让大部分程序员下岗的功能…

导入pgsql中的保存的html数据到hive时,换行符无法被repalce

数据如图所示&#xff1a; 当我使用replace函数 \r\n 、\r 、 \n替换时。无论如何都无法替换 最终发现可以使用chr(ASCII码) 可以匹配到&#xff0c;坑我好久。 replace(replace(replace(replace(replace(bid_html_con, chr(9),),chr(10),),chr(13),),chr(160),),chr(32),)

EDA 数字时钟

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数字时钟是什么&#xff1f;二、EDA里面数码管的显示1.元件模型2.参考程序3. 实验仿真波形4.实验现象5. 仿真问题 三、显示时钟1. 时钟电路模块2.参考程序3…

社交媒体图像识别与情感分析

社交媒体图像识别与情感分析是当前人工智能领域的一个研究热点。通过对社交媒体上大量的图像和文本数据进行深度学习和情感分析&#xff0c;可以提取出图像中的情感信息&#xff0c;从而为社交媒体用户提供更加个性化和精准的内容推荐和服务。 在社交媒体图像识别方面&#xff…

祝贺 年citation突破100

有好多年&#xff0c;写不出1篇论文了&#xff0c;也没有思路&#xff0c;觉得做的内容非常浅&#xff0c;一直忙于实际应用项目&#xff0c;偏技术突破。 2018出国访学后&#xff0c;重新看文献&#xff0c;整理思路&#xff0c;拓展思维&#xff0c;逐步写了几篇论文&#x…

Selenium自动化(上)

Selenium 安装 环境准备 第一种方式 Python 自带的 pip 工具安装。 pip install selenium4.12.0安装完成后&#xff0c;查看安装的 Selenium 版本号。 pip show selenium第二种方式 安装 Selenium 的前提是拥有 Python 开发环境&#xff08;推荐使用 PyCharm&#xff09;。…

外贸企业邮箱推荐:高抵达率的邮件解决方案

外贸邮箱用哪个企业邮箱邮件抵达率高&#xff1f; 在邮件到达率方面&#xff0c;Zoho Mail企业邮箱具有以下优势&#xff1a; 高效率的反垃圾邮件功能&#xff1a;Zoho Mail配备了前沿的反垃圾邮件过滤技术&#xff0c;能准确识别和拦截垃圾邮件&#xff0c;保证重要邮件能按时…

恢复图片?这4个方法别错过!

“我保存在电脑里的很多照片不知道是被误删了还是其他什么原因&#xff0c;莫名其妙就消失了。我应该通过什么方法找回这些丢失的图片呢&#xff1f;请大家帮帮我吧&#xff01;” 在这个信息时代&#xff0c;图片已经成为我们记录生活、分享经验、沟通交流的重要工具。有时候&…

解决使用pnpm安装时Sharp模块报错的方法

在使用pnpm进行项目依赖安装的过程中&#xff0c;有时候会遇到Sharp模块报错的情况。Sharp是一个用于处理图像的Node.js模块&#xff0c;但它的安装可能会因为各种原因而失败&#xff0c;导致项目无法正常启动。本文将介绍这个问题的方法。 问题描述 解决方法 在命令行分别输…

【算法题】连续字母长度(js)

我自己的解法: 难点就在于如何使其计算重复的值&#xff0c;以及最后一次结果别忘记添加进对象里。 function solution(str, index) {const arr str.split("");let currentChar arr[0];let time 1;const obj {};for (let i 1; i < arr.length; i) {if (arr[i…