c语言---文件

这一节我准备分三个部分来带领大家了解文件

——一、有关文件的基础知识
————二、文件的简单操作
————————三、文件结束的判定
————————————四、文件缓冲区

一、文件的基础知识

首先在了解文件之前,我们需要了解C/C++程序内存的划分:
请添加图片描述
1、为什么要使用文件

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

例如:

int main()
{int n = 0;scanf("%d", &n);printf("%d", n);return 0;
}
//这里的n就是存储于内存中的,如果退出程序,n就会被回收,数据也就会丢失

2、什么是文件?

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

(1)程序文件:
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
(2)数据文件:
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
——我们这里所说的文件指数据文件

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

4、⼆进制⽂件和⽂本⽂件:

(1)数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件
(2)如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件

以上就是有关文件的知识,下面就是我们的文件的简单操作。

二、文件的简单操作

1、流和标准流:

(1)流:

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

(2)标准流:

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语⾔程序在启动的时候,默认打开了3个流:
stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出流中。
stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

2、文件指针:

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

例如,VS2013 编译环境提供的 stdio.h 头⽂件中有以下的⽂件类型申明:
在这里插入图片描述
不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
一般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。

FILE* pf;//⽂件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。
在这里插入图片描述
3、文件的打开与关闭:

文件的使用就像是我们喝水的动作,首先我们需要拧开瓶盖,然后喝水,喝完后关闭瓶盖。文件的使用一样先打开,再进行一系列操作,最后关闭文件。

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

int main()
{//打开文件FILE* pf = fopen("wenjian.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读写文件//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:

在这里插入图片描述
3、文件的顺序读写
在这里插入图片描述
首先,第一组fputc与fgetc:

fputc一个字符一个字符的放入我们的文件:

#include<stdio.h>int main()
{//打开文件FILE* pf = fopen("wenjian.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件fputc('a', pf);fputc('b', pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
fgetc一个字符一个字符从文件中读取(返回值int)
1、如果成功读取返回字符的ASCLL码值。
2、如果读取失败返回EOF。
在这里插入图片描述
第二组:fgets、fputs
1、fputs:添加一个字符串在我们的文件里,但是我们不主动添加换行的话,添加的字符串全都会在文件的第一行

#include<stdio.h>int main()
{//打开文件FILE* pf = fopen("wenjian.txt", "w");if (pf == NULL){perror("fopen");return 1;}//文件fputs("hello world", pf);fputs("hello computer", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

2、fgets:
char * fgets ( char * str, int num, FILE * stream );

对于这个函数,我们需要一个数组去存储我们读取的元素,str就是我们的数组指针,num是我们要读取的字符个数,但是它最多只会读取n-1个元素,它会自动将最后一个元素的位置补上’\0’,并且它只会读一行的元素,如果第一行元素小于num那么它只会将第一行的元素全部读取,如果’\n’也在我们的读取范围内,它也会将其读取上。
在这里插入图片描述
如果读取成功返回我们的数组指针,如果读取失败返回NULL;

第三组:fscanf与sprintf

1、fprintf

struct person
{char name[20];int age;float score;
};
int main()
{struct person s = { "zhangsan",20,70.4f };//打开文件FILE* pf = fopen("wenjian.txt", "w");if (pf == NULL){perror("fopen");return 1;}//文本形式写文件fprintf(pf, "%s %d %f", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

2、fscanf

在这里插入图片描述
同时上面的函数适用于所有输入输出流,什么意思呢?我们的scanf,printf不是运用了我们的stdin,stdout吗,例如fscanf、fprintf我们只需要将文件指针,改成我们的输入输出流,就可以让这些函数变成普通的scanf,printf。
在这里插入图片描述

此外还有两个函数sscanf、与sprintf。

在这里插入图片描述
4、文件的随机读写
上面所有的函数都是一个字符或者一个字符串的形式读或写,那我们如何读取指定的文件内容呢?
那就是
1、fseek(根据⽂件指针的位置和偏移量来定位⽂件指针)。
在这里插入图片描述

int main()
{//打开文件FILE* pf = fopen("wenjian.txt", "r");if (pf == NULL){perror("fopen");return 1;}//文件zhangsan 20 70.400002int ch = fgetc(pf);printf("%c\n", ch);//应该打印z,光标移动到hfseek(pf, 4, SEEK_CUR);//从光标位置开始偏移4个位置ch = fgetc(pf);printf("%c\n", ch);//打印s//关闭文件fclose(pf);pf = NULL;return 0;
}
//如果使用SEEK_END那么偏移量为负数/0即可

2、ftell:返回⽂件指针相对于起始位置的偏移量

int main()
{//打开文件FILE* pf = fopen("wenjian.txt", "r");if (pf == NULL){perror("fopen");return 1;}//文件zhangsan 20 70.400002int ch = fgetc(pf);//printf("%c\n", ch);//应该打印z,光标移动到hfseek(pf, 4, SEEK_CUR);//从光标位置开始偏移4个位置,s位置printf("%d", ftell(pf));//从文件起始位置到当前位置,从z到s偏移了5,所以打印5//关闭文件fclose(pf);pf = NULL;return 0;
}

3、rewind:让⽂件指针的位置回到⽂件的起始位置

void rewind ( FILE * stream );即可。

三、文件结束的判定

在这里插入图片描述

在这里插入图片描述

int main()
{//打开文件FILE* pf = fopen("wenjian.txt", "r");if (pf == NULL){perror("fopen");return 1;}//文件zhangsan 20 70.400002int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}printf("\n");//判断什么原因读取结束if (feof(pf)){printf("遇到文件末尾");}else if (ferror(pf))//发生错误{perror("ferror");}//关闭文件fclose(pf);pf = NULL;return 0;
}

学完上面的我们就可以拷贝文件了对不对。
在这里插入图片描述

四、文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为
程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓
冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输
⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓
冲区的⼤⼩根据C编译系统决定的。
在这里插入图片描述
到这里我们的文件就结束了,大家可以在cplusplus里查看这里的函数,再自己尝试写一下。

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

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

相关文章

安卓相关环境配置

安卓相关环境配置 偶尔更新。。。 JEB&#xff08;动态调试好用&#xff09; JEB动态调试Smali-真机/模拟器&#xff08;详细&#xff0c;新手必看&#xff09; 夜步城 JADX官网&#xff08;静态分析&#xff09; https://github.com/skylot/jadx/releases/tag/v1.5.0 雷…

MATLAB多项式拟合

订阅专栏或下载资源可以获得源代码:https://download.csdn.net/download/callmeup/89632160 拟合和插值 拟合和插值是两种常见的数学方法,用于以某种方式近似或估计实际数据。 拟合是在给定一组已知数据点的情况下,通过选择一个合适的数学模型来拟合数据。拟合的目标是找到…

民航管理局无人机运营合格证技术详解

1. 证书定义与意义 民航管理局无人机运营合格证&#xff08;以下简称“合格证”&#xff09;是对符合民航法规、规章及标准要求的无人机运营单位或个人进行资质认证的重要证明。该证书旨在确保无人机运营活动的安全、有序进行&#xff0c;保护国家空域安全&#xff0c;维护公众…

Linux·权限与工具-yum与vim

1. Linux软件包管理器 yum 1.1 什么是软件包 在Linux下安装软件&#xff0c;一个通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但这样做太麻烦了&#xff0c;于是有些人把一些常用的软件提前编译好&#xff0c;做成软件包(可以理解成Win…

超有性价比深度学习卡特斯拉 P100,16G大显存,Stable Diffusion AI 绘画利器

超有性价比深度学习卡特斯拉 P100&#xff0c;16G大显存&#xff0c;Stable Diffusion AI 绘画利器 在当今数字化创作的时代&#xff0c;AI 绘画技术正以惊人的速度发展&#xff0c;为艺术家和创作者们带来了全新的可能性。而要实现高效的 AI 绘画&#xff0c;一款性能卓越的显…

Camera基础知识系列(5)——景深

目录 一. 前言 二. 景深 2.1 弥散圆 2.2 容许弥散圆 2.2 景深(DoF) 三. 如何控制景深 1. 光圈因素 2. 容许弥散圆因素 四. 总结 一. 前言 在摄影中&#xff0c;我们有时会有模糊背景、突出主体的需求&#xff0c;即背景虚化。如下图所示&#xff0c;左边是没有做背景虚化…

序列建模之循环和递归网络 - 递归神经网络篇

序言 在序列建模的广阔领域中&#xff0c;递归神经网络&#xff08; Recursive Neural Network, RNN \text{Recursive Neural Network, RNN} Recursive Neural Network, RNN&#xff09;&#xff0c;注意此处的 RNN \text{RNN} RNN与常用于序列处理的循环神经网络在命名上有所…

打包时未添加camera模块,请参考https://ask.dcloud.net.cn/arss/1ooticle/283

今天在app打包使用的时候突然发现app在拍照上传照片的时候遇到这个问题 遇到这种情况通常是因为app打包的时候manifestjson文件中App模块配置中的Camera&Gallery配置没有打开&#xff0c;点击相应选项勾选即可 然后再上传打包就好了! 哈哈哈好久没写博客了最近太忙了&…

使用 Hugging Face 和 Milvus 构建 RAG 系统

Milvus 是一个广受欢迎的开源向量数据库&#xff0c;为人工智能应用提供高性能和可扩展的向量相似性搜索。在本教程中&#xff0c;我们将向您展示如何使用 Hugging Face 和 Milvus 构建 RAG&#xff08;检索增强生成&#xff09;流程。 RAG 系统将检索系统与 LLM 相结合。该系统…

android13 禁用wifi

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 3.1 代码位置1 3.2 代码位置2 3.3 代码位置3 4.代码修改 5. 彩蛋 1.前言 这个文章讲的是,在frameworks里面禁止打开wifi。 2.情况分析 我们打开wifi一般是 public static void turnOnWifi(Co…

x64汇编语言与逆向工程实战指南(四)

目录 1. 数组的存储与遍历1.1 编写数组数据写入内存1.2 汇编循环遍历数组元素 3. Lea指令4. mul指令与imul指令4.1 mul 指令4.2 imul 指令总结 5. div指令5.1 div 指令的基本原理5.2 8 位除法5.3 16 位除法5.3 32 位除法特点和要求 1. 数组的存储与遍历 1.1 编写数组数据写入内…

day28-lsync服务+scp命令

假设nfs服务器挂了&#xff0c;就要走backup服务器也部署nfs 这种情况下&#xff0c;rsync和nfs要用到同一个文件夹&#xff0c; 所以他俩管理文件夹权限必须一样 1. lsyncrsyncnfs rsync服务 10.0.0.41 1.安装rsync [rootbackup:~]#yum -y install rsync 2.配置rsync[root…

2024年8月18日历史上的今天大事件早读

648年8月18日 唐初名相房玄龄逝世 1850年8月18日 法国作家巴尔扎克逝世 1868年8月18日 英法天文学家发现“氦”元素 1905年8月18日 反清革命组织共进会成立 1914年8月18日 美国总统宣布在“一战”中保持中立 1925年8月18日 国民革命军正式组建 1926年8月18日 北伐军攻克汀…

Open3D 格网法计算点云的占地面积

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概…

详解语义安全(semantically secure)

目录 一. 引入 二. 密文与明文 2.1 通俗性理解 2.2 定理 2.3 定理理解 三. 语义安全的第一个版本 3.1 基本理解 3.2 定理 3.3 定理理解 四. 语义安全的第二个版本 4.1 直观解释 4.2 小结 一. 引入 密码学中安全加密要求&#xff1a;敌手&#xff08;adversary&…

串(4/6)

目录 1. 串的概念及应用实例 1.1 串的定义 1.2 应用实例 2. 串的基本操作 2.1 创建和读取 2.2 串的拼接 2.3 串的比较 2.4 插入和删除 2.5 查找子串 3. 串的存储结构及实现 3.1 顺序存储结构 3.2 链式存储结构 3.3 存储结构的选择 4. 串的模式匹配算法 4.1 朴素匹…

Hive3:常用的内置函数

1、查看函数列表 -- 查看所有可用函数 show functions; -- 查看count函数使用方式 describe function extended count;2、数学函数 -- round 取整&#xff0c;设置小数精度 select round(3.1415926); -- 取整(四舍五入) select round(3.1415926, 4); -- 设置小数精度4位(四…

应急响应-DDOS-典型案例

某单位遭受DDoS攻击事件如下 事件背景 2019年2月17日&#xff0c;某机构门户网站无法访问&#xff0c;网络运维人员称疑似遭受DDoS攻击&#xff0c;请求应急响应工程师协助。 事件处置 应急响应工程师在达到现场后&#xff0c;通过查看流量设备&#xff0c;发现攻击者使用僵…

汇编语言:call、call far ptr、call word ptr、call dword ptr、call 寄存器

引言 call指令是转移指令&#xff0c;CPU执行call指令&#xff0c;进行两步操作&#xff1a; &#xff08;1&#xff09;将当前IP或当前CS和IP压入栈中 &#xff08;2&#xff09;转移。call指令不能短转移&#xff0c;除此之外&#xff0c;call指令转移的方法跟jmp指令的原理…

Java流程控制09:练习题:打印三角形

本节视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 通过嵌套for循环可以实现打印三角形&#xff…