文件的处理(c语言)

embedded/2024/11/27 16:08:19/


首先了解下文件的作用

文件可以把数据直接放在电脑的硬盘上,实现了数据的持久化

什么是文件

文件就是磁盘上的文件。在程序设计中,文件通常有俩种,一种是程序文件,另一种是数据文件(这是从文件功能来分类的)

程序文件

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

数据文件

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

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用

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

例如: c:\code\test.txt
文件标识通常被称为文件名


文件指针

缓存文件系统中,关键的概念时“文件类型指针”,简称“文件指针”

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(文件的名字,文件状态及当前的位置)。这些信息是保存在一个结构体的变量中。该结构体类型是有系统声明的,取名FILE

注意:

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息。

通过FILE的指针来维护这个FILE结构的变量

创建一个FILE*指针变量

FILE* pf  //文件指针变量

解释:

定义一个pf指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(这使一个结构体的变量)。通过该文件信息区就能访问文件。也就是说,通过文件指针变量来找到与它相关联的文件

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统时指系统自动地在内存中每一个正在使用的文件开辟一块“文件缓冲区”,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上,如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等).缓冲区地大小根据c编译系统决定地。


文件的打开与关闭

文件在读写之前应该打开文件,在读写结束后,应该关闭文件。

那么文件是如何打开和关闭的

//打开文件
//第一个参数为文件名,第二个参数为打开方式
FILE* fopen(const char* filename,const char* mode);
//关闭文件
//这个下面的参数是文件指针
int fclose (FILE * stream);

打开方式如下

代码如下

int main()
{//打开文件,如果打开成功,则会在相应的工程目录下,创建这个文件FILE* pf = fopen("wozuishuai.txt", "w");//判断文件是否打开成功if (pf == NULL){perror("fopen");return 1;}//关闭文件fclose(pf);return 0;
}

成功创建了一个空白文档👇

注意:

当用以w方式打开文件时,如果有文件,那么这个文件中的内容将会销毁,会创建出了一个新的文件


c语言中的3种流

写文件的时候:文件流

终端设备-屏幕 : 标准输出流stdout

键盘:                 标准输入流stdin

屏幕:                  标准错误流 stderr


文件中的相关函数

接下来将会对这些函数进行学习👇


fgetc和fputc函数

fputc是把字符写到文件中

fgetc就是在程序中输出这个字符

1.fgetc

2.fputc


注意:

这里的流就是文件指针

fputc的使用

这下面代码会在你的硬盘中的项目文件中创建一个文档,并把w字符输入其中

int main()
{//文件打开方式为wFILE* pf = fopen("text.txt", "w");//打开文件if (pf == NULL){perror("fopen");return 1;}//把w写入文件中fputc('w', pf);//关闭文件fclose(pf);//把文件指针置成空指针,防止之后变成野指针pf = NULL;return 0;
}
fgetc的使用

这下面的代码就是从文档中读取内容,并输出出来


fgets和fputs函数

1.fputs

2.fgets

fputs的用法

fgets的用法


fprintf和fscanf函数

fprintf

用于向指定的文件流中写入格式化的数据。它的操作方向是从程序内存中的数据到文件。

fscanf

用于从指定的文件流中读取格式化的数据。它的操作方向是从文件到程序内存。

1.fprintf

fprintf的使用
struct S
{int n;float f;char arr[20];
};int main()
{struct S s = { 100,3.14f,"lisi" };//打开文件FILE* pf = fopen("text.txt", "w");//判断文件是否打开成功if (pf == NULL){perror("fopen");return 1;}//在文件中存放数据fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

2.fscanf

fscanf的使用
struct S
{int n;float f;char arr[20];
};int main()
{struct S s = { 0 };//打开文件,并读取文件中的内容FILE* pf = fopen("text.txt", "r");//判断文件是否打开成功if (pf == NULL){perror("fopen");return 1;}//读文件,把文件读取到程序fscanf(pf, "%d %f %s\n",&(s.n),&(s.f),s.arr);printf("%d %f %s\n", s.n, s.f, s.arr);//关闭文件fclose(pf);pf = NULL;return 0;
}


对比一组函数

scanf/fscanf/sscanf

printf/fprintf/sprintf

首先说明一下sscanf和sprintf函数的用法

1.sprintf函数

把一个格式化的数据转换成字符串

sprintf函数的用法
struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = { 200,3.5f,"lisi" };char arr[200] = { 0 };//将一个格式化数据转换成一个字符串sprintf(arr, "%d %f %s\n", s.n, s.f, s.arr);printf("%s\n", arr);return 0;
}
sscanf函数的用法

struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = { 200,3.5f,"lisi" };char arr[200] = { 0 };//把格式化数据转换成字符串//把数据储存在arr数组中sprintf(arr, "%d %f %s\n", s.n, s.f, s.arr);printf("%s\n", arr);//把字符串转换成格式化数据struct S tmp = { 0 };sscanf(arr, "%d %f %s\n", &(tmp.n), &(tmp.f), &(tmp.arr));printf("%d %f %s\n", tmp.n, tmp.f, tmp.arr);return 0;
}

这些函数的区别

scnaf针对标准输入流(stdin)的格式化的输入函数

printf针对标准输出流(stdout)的格式化的输出函数

fscanf针对所有输入流(文件流/stdin)的格式化输入函数

fprintf针对所有输出流(文件流/stdout)的格式化输出函数

sscanf  把字符串转换成格式化的数据

sprintf  把格式化的数据转换成字符串


fread函数

读取文件的内容

fread函数的用法

fseek函数

可以自己设置文件指针的位置



fseek函数的用法

rewind函数

让文件指针回到起始位置

ftell函数

具有返回偏移量的功能


文本文件和二进制文件

数据文件被称为文本文件或者二进制文件

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

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

数据在内存中的存储的方式

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


文件读取结束的判定

feof函数

注意:

在文件读取过程中,不能用feof函数的返回值来判断文件是否结束

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者NULL ( fgets )

例如:

fgetc 判断是否为 EOF .

fgets 判断返回值是否为 NULL .

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

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

结语:

限于水平,本篇文章不足之处在所难免,多多包涵,如有什么错误,大家可以指出来



http://www.ppmy.cn/embedded/140943.html

相关文章

如何寻找适合的HTTP代理IP资源?

一、怎么找代理IP资源? 在选择代理IP资源的时候,很多小伙伴往往将可用率作为首要的参考指标。事实上,市面上的住宅IP或拨号VPS代理IP资源,其可用率普遍在95%以上,因此IP可用率并不是唯一的评判标准 其实更应该关注的…

C++设计模式之组合模式中适用缓存机制提高遍历与查找速度

在组合设计模式中,为了提高反复遍历和查找的速度,可以引入缓存机制。缓存机制可以通过存储已经遍历过的子组件或计算过的结果来减少重复操作的开销。以下是一个示例,展示了如何在组合模式中使用缓存机制来提高性能。 示例:组合设…

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题:在远程调用另一个服务时,我们采用的解决办法是发送一次http请求,每次环境的变更会产生新的地址,所以采用硬编码会出现很多麻烦,并且为了应对并发问题,采用分布式部署&#…

Hive-定时清理无用的临时表

背景: 有一个临时库,大家平时开发过程中比较常用,这个库的表的生命周期没有得到很好的管理,日积月累导致无用表增多,所以跟运维提了个方案,定期清理。提出了一个比较简单的方案。 解决方案: sh…

【Leetcode】3206.交替组1

题目描述: https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例: 解题思路 思路一: 1.如果color.size()小于等于2,则构不成环,直接返回结果…

数据结构--Map和Set

目录 一.二叉搜索树1.1 概念1.2 二叉搜索树的简单实现 二.Map2.1 概念2.2 Map常用方法2.3 Map使用注意点2.4 TreeMap和HashMap的区别2.5 HashMap底层知识点 三.Set3.1 概念3.2 Set常用方法3.3 Set使用注意点3.4 TreeSet与HashSet的区别 四.哈希表4.1 概念4.2 哈希冲突与避免4.3…

林业产品推荐:Spring Boot技术挑战

摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此林业产品销售信…

数据结构之栈:从原理到实现

1. 什么是栈? 在数据结构中,栈(Stack)是一种非常基础的线性数据结构,它的特点是后进先出(LIFO, Last In First Out)。想象一个装盘子的架子,你只能从最上面拿盘子或放盘子&#xff…