文件操作相关的精讲

目录:
思维导图
一. 文件定义
二. 文件的打开和关闭
三. 文件的顺序读写操作
四. 文件的随机读写操作
五. 文本文件和二进制文件
六. 文件读取结束的判断
七.文件缓冲区

 

思维导图:

一. 文件定义
1.文件定义

C语言中,文件是指一组相关数据的集合。

不知道大家是否注意到这样的问题:当我们执行一个程序的时候,数据并不会消失,但是当我们程序退出,那么数据就会消失,这是为啥???

当我们运行程序的时候,数据都是加载到内存上的,这样的运行效率会更高。一旦程序退出,内存上的数据就消失了。

当我们把数据存储在磁盘上,我们可以随时随地查看数据,不会存在数据的消失问题。

文件的作用:把数据进行永久化的保存,即使程序退出,数据也是不会消失。

2. 文件分类

2.1 程序文件

包括源程序文件(后缀:.c),目标文件(Windows后缀:.obj),可执行程序(后缀:.exe)

2.2数据文件

数据文件是程序运行时读,写的数据

3.对程序与文件之间关系的理解

二. 文件的打开和关闭
1. 文件指针

在C中:定义一个FILE* (文件指针) 类型的指针,就可以对文件进行各种读和写的操作。

每一个被指定使用的文件都会有一个对应的文件信息区,用来存放当前文件的相关信息(大小,文件位置,文件状态……),这些信息都是通过一个FILE* 类型指针进行维护的。

2文件的基本操作

fopen() 第一个参数:要操作文件的名字

fopen() 函数返回值

打开文件的方式:

 

 

三. 文件的顺序读写操作
1. 相关的函数使用介绍

2. 对文件的使用操作

1)fgetc()   fputc()

 fgetc() 一旦读取失败或者是遇到文件末尾会返回一个EOF

对于fputc()函数的使用和fgetc()函数使用以及函数操作失败返回值 是一样的。

这两个函数都是对字符进行一个一个操作

使用栗子:

 2)fgets() 和 fputs()

 

 注意:

fgets() 最多只能读取num-1个字符,遇到换行符结束读取,

fgets()  fputs()只能是针对性的一行字符串进行处理

每一次打开文件的时候FILE* pf  指针都会默认指向文件内容的起始位置

3)fscanf() fprintf()

 fscanf()功能:从流里面读取格式化的数据

fprintf()功能:把格式化的数据写入流里面

使用例子

 

4)sscanf()  sprintf()

sscanf() 函数功能:从字符串里面把数据转成指定的格式化

sprintf() 函数功能: 把指定格式化的数据转换成字符串

使用例子:

 

5)fread()  fwrite()

 

 fread() 函数功能:从流里面读取数据以二进制读的方式(“rb”)

参数介绍:

ptr:把读取之后的数据存放起来

 count: 要读取的数据个数

size:  读取每一个数据大小,单位字节

stream:数据流

 fread() fwrite()函数参数基本一样;

fwrite() 函数功能:把数据写进一个流里面以二进制写的方式(“wb”)

前者功能是读取一个二进制文件,后者是对一个二进制文件进行写入数据。只不过当我们打开写入之后的这个二进制文件咱是看不懂的

四. 文件的随机读写操作

不知道大家是否注意到这样一个问题:咱们每一次打开指定的文件的时候,文件指针都会默认指向文件内容的起始位置;如果想要每次打开文件的时候在任意一行的某个位置指定呢???

1. fseek()

 

 fseek() 函数功能:根据文件指针的位置和偏移量重新定义指针的指向位置

函数返回值:成功的话,返回数值0;否则返回非0的数值

参数介绍:

stream:文件指针

offset: 偏移量(非正数即负数

origin:指定文件指针的位置

 

2. ftell()

ftell() 函数功能:返回当前指针与起始位置的偏移量。

此函数返回值:也是返回当前指针所在位置距离起始位置的偏移量 

3.rewiind()

rewind() 函数功能:让FILE*  类型的指针重新回到文件的起始位置 

 关于以上3个函数综合应用:

int main()
{int arr[10] = { 0 };FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);//afseek(pf, 5, SEEK_CUR);//注意是从b这个位置偏移5个位置,指向gch = fgetc(pf);printf("%c\n", ch);//gprintf("当前指针距离起始位置的偏移量:%d\n", ftell(pf));//pf每次使用完会自动指向下一个数据的位置,此时指向hrewind(pf);//此时指针从当前位置重新回到文件的起始位置char ret[100] = "xxxxxxx";fgets(ret, 10, pf); //从pf所在位置开始最多读取9个字符放到ret这个数组printf("%s\n",ret);fclose(pf);pf = NULL;return 0;
}

运行结果:

 

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

根据数据输出的组织形式,数据文件分为文本文件和二进制文件。

数据在内存里面以二进制形式存储,当数据输出的时候不加以任何形式的转换,此时文件称之为二进制文件

但是当数据 输出的时候要求以ASCII码的形式输出到外存(硬盘),此时的文件称之为文本文件

  数据是如何存储在内存里的???

 

字符一律以ASCII形式存储
数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

 举个例子:数据100000 以字符形式存储和以数值形式存储所占大小是不一样的

 数值类型存储占4个字节:

int main()
{int a = 100000;FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("fopen()");return -1;}fwrite(&a, sizeof(int), 1, pf);//以数值型存储100000fclose(pf);pf = NULL;return 0;
}

 此文件是以二进制编辑方式打开的

关于如何以二进制编辑打方式开指定文件见下:

 

分析:

 100000以ASCII 形式存储占6个字节:

 

 注意:

关于数据大小(单位字节)并不是由数据是以什么形式存储在内存里决定的。

六. 文件读取结束的判断
1. feof()

对于此函数相信有很多老铁会被误导吧!

feof()函数返回值是不能用来判断文件是否读取结束滴!

feof()函数功能:

当用户自己明确知道文件已经读取结束了,调用此函数判读文件是因为读取失败而结束还是遇到文件末尾正常结束的。

1.1

对于文本文件是否读取结束滴返回值的判断应该调用函数fgetc() :对应返回值EOF

fgets()返回值:NULL

1.2

二进制文件的读取结束判断返回值是否小于实际读取的个数即可

比如:fread() 函数

2. 使用
#include <stdlib.h>int main(){int c; FILE* fp = fopen("test.txt", "r"); //读的方式打开此文件if (fp == NULL) {perror("fopen()");return -1;}while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环{putchar(c);}//判断是读取结束原因//fgetc() 当读取失败的时候或者遇到文件结束的时候,都会返回EOFif (ferror(fp)) // ferror() 判断是否异常结束读取的puts("I/O error when reading");else if (feof(fp))// feof() 明确知道读取结束,判断是否遇到文件末尾结束读取puts("End of file reached successfully");fclose(fp);fp = NULL;return 0;}
七.文件缓冲区

不知道各位是否想过这样一个问题:当我们从文件读取数据的时候,这些数据是瞬间就被成功读取了还是说系统有一定的处理机制呢???

对于这个问题,涉及到文件缓冲区的知识点:

ANSIC 标准采用 缓冲文件系统 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中
为程序 中每一个正在使用的文件开辟一块 文件缓冲区

当我们从文件读取数据的时候,这些数据并不是瞬间就被读取了,而是先进入一个内存缓冲区,等到这个缓冲区达到一定条件(比如说:缓冲区满了;又或者是数据读取已经结束了等等),这些数据就会被送到程序数据区;

对于写入数据是一样的道理

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

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

相关文章

Java中的二叉搜索树(如果想知道Java中有关二叉搜索树的知识点,那么只看这一篇就足够了!)

前言&#xff1a;Java 提供了丰富的数据结构来处理和管理数据&#xff0c;其中 TreeSet 和 TreeMap 是基于红黑树实现的集合和映射接口。它们有序地存储数据&#xff0c;提供高效的搜索、插入和删除操作。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

web基础,http协议,apache概念及nginx

一、web相关概念 Web&#xff0c;全称World Wide Web&#xff0c;通常简称为WWW、Web或万维网&#xff0c;是一个基于超文本和HTTP&#xff08;超文本传输协议&#xff09;的、全球性的、动态交互的、跨平台的分布式图形信息系统。它起源于1989年&#xff0c;由英国科学家蒂姆…

文本编辑三剑客(grep)

目录 正则表达式 元字符 grep 案例 我在编写脚本的时候发现&#xff0c;三个文本编辑的命令&#xff08;grep、sed、awk&#xff0c;被称为文本编辑三剑客&#xff0c;我习惯叫它三巨头&#xff09;用的还挺多的&#xff0c;说实话我一开始学的时候也有些懵&#xff0c;主要…

(史上最全的)Spring6框架学习教程

一、什么是Spring 1.javaWeb框架发展史 1、ServletJSPJavaBean(跳转页面、业务逻辑判断、数据库查询) 2、MVC三层架构(M Model pojo(User)V-view(USP)C-(controller-servlet)) (web-跳转页面service-业务逻辑判断 new UserService0;dao-数据库查询 new UserDao(); ) 3、使用…

二、八、十、十六进制介绍及相互转换

目录 1、引言&#xff1a; 2、进制介绍及区分 2.1 介绍 2.2 区分 2.3 各进制的数字组成 3、2进制与10进制 3.1 十进制的介绍 3.2 二进制的介绍 4、2进制与10进制的转换 4.1 二进制转十进制 4.2 十进制转二进制 5、8进制和16进制 5.1 八进制的介绍 5.2 十六进制的介…

告别抠图烦恼,1秒搞定100张图片背景更换!

想象一下&#xff0c;你手头有几十张甚至上百张证件照需要从白底换成蓝底&#xff0c;而你只能用Photoshop一张张抠图&#xff0c;调整&#xff0c;然后保存。这个过程不仅耗时&#xff0c;还容易出错&#xff0c;特别是当你急需处理大量图片时&#xff0c;简直让人抓狂。 千鹿…

“云+端”体系覆盖590余所学校,张家口如何建设“教育一朵云”?

当将装有小苏打的气球套在装有白醋的塑料瓶瓶口时,一场令人惊叹的化学反应开始上演——瓶内瞬间白雾腾起弥漫,气泡翻滚不息,气球逐渐吹了起来......这是在张家口教育云平台上的由学生及家长上传的关于“小苏打吹气球”的科学实验视频,而学生们与家长参与的便是张家口市中小学云…

昇思MindSpore学习入门-静态图高级编程技巧二

如何优化执行性能 使用jit_class 使用场景&#xff1a;使用jit_class装饰器修饰自定义类&#xff0c;提高执行性能。jit_class应用于静态图模式&#xff0c;在动态图模式下&#xff0c;jit_class会被忽略&#xff0c;不影响动态图模式的执行逻辑。 jit_class的介绍 用户在网…

快递代拿系统/快递代领系统

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括快递代拿系统的网络应用&#xff0c;在外国快递代拿已经是很普遍的方式&#xff0c;不过国内的快递代拿可能还处于起步阶段。快递代拿系统具有代取物品功能。快递代拿系…

嵌入式学习Day12---C语言提升

目录 一、指针数组 1.1.什么是指针数组 2.2. 格式 2.3.存储 2.4.与字符型二维数组相比 2.5.什么时候使用指针数组 2.6.练习 二、数组指针 2.1.什么是数组指针 2.2.格式 2.3.一维数组 2.3.特点 2.4.什么时候使用 三、指针和数组的关系 3.1.一维数组和指针 …

ps制作镂空文字

1、创建文字。 2&#xff0c;栅格化文字 2、载入选取 3.选择》修改》收缩 4、然后再点击删除键&#xff0c;镂空文字效果就做好了。 同样适用于简单的图片logo

AI智能名片小程序在预测性产品管理与营销中的深度应用探索

摘要&#xff1a;本文深入探讨了AI智能名片小程序在预测性产品管理与营销中的广泛应用及其带来的深远影响。通过详细分析该技术在数据收集、市场分析、用户画像构建、个性化推荐、客户关系管理以及风险预测等方面的具体实践&#xff0c;本文揭示了AI智能名片小程序如何助力企业…

刚起步的小型海外仓有必要上WMS系统吗?答案来了

首先&#xff0c;这里的自动化主要是指将库存管理、SKU管理&#xff0c;一件代发、财务管理等海外仓的日常作业流程通过WMS系统实现的自动化。 而不是指海外仓自动化机器人、智能导轨等硬件设备。 文章会针对刚起步的一些小型海外仓是否有必要使用WMS系统进行讨论&#xff0c…

捷报来袭!上半年HCIE通过120人!证书量总计1767

智汇云校捷报 —上半年华为认证证书量1767本— 2024年上半年&#xff0c;云校HCIA、HCIP、HCIE证书量总计1767本&#xff01; HCIA&#xff1a;1240本 HCIP&#xff1a;407本 HCIE&#xff1a;120本 祝贺以下学员通过HCIE认证&#xff01; 欢迎有考证需求的学员 咨询云校…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来&#xff0c;制造图形界面的移动使用&#xff0c;那接下来我会与你一同使用它&#xff0c;并进行study&#xff0c;如有困惑&#xff0c;可随时联系。 然后&#xff0c;需要使用pysimplgui&#xff0c;如果…

[网络编程】网络编程的基础使用

系列文章目录 1、 初识网络 网络编程套接字 系列文章目录前言一、TCP和UDP协议的引入二、UDP网络编程1.Java中的UDP2.UDP回显代码案例3.UDP网络编程的注意事项 三、TCP网络编程1.TCP回显代码案例2.TCP多线程使用 总结 前言 在学习完基础的网络知识后&#xff0c;完成跨主机通…

元器件基础学习笔记——二极管基础

一、二极管基础 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件&#xff0c;具有单向导电性&#xff0c;是现代电子技术的基石。它在电子电路中扮演着至关重要的角色&#xff0c;通过与电阻、电容、电感等元器件的合理连接&#xff0c;能够实现整流、检波、限幅、稳压等…

Midjourney只需输入描述性文本,就能生成栩栩如生的图像

前言 Midjourney 是一款基于人工智能的图像生成工具&#xff0c;由 Midjourney 研究实验室开发。它最初在2022年3月面世&#xff0c;并在同年7月12日开始公开测试。Midjourney 的核心功能是能够根据用户提供的文本提示&#xff08;prompt&#xff09;&#xff0c;利用其内置的…

【软件测试】--接口自动化测试

1. 接口自动化 1.1 概念 接口测试&#xff1a;是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑依赖关系 自动化测试&#xff1a;是把以人为驱动的测试行为转化为机器执行的一种过程 接口自动化测试&#xff1…

【详细】Ubuntu下安装qt5

Ubuntu下安装qt5 一. QT安装环境准备1、判断gcc是否安装2、安装g3、安装clang编译器4、安装 clang 5、安装make6、安装make-guile7、安装cmake 二. QT5安装1、安装Qt5的组件2、安装Qt的开发工具3、安装qtcreator4、安装qt55、安装qt charts&#xff08;可选&#xff09; 三、安…