[C语言]-基础知识点梳理-文件管理

前言

  • 各位师傅们好,我是qmx_07,今天给大家讲解文件管理的相关知识,也就是常见的 读取,删除一类的操作

文件

为什么要使用文件?

  • 程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了
  • 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化

文件分类

  • 在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的
  • 程序文件:包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)
  • 数据⽂件:⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件
  • 文件名:⽂件路径+⽂件名主⼲+⽂件后缀

文件的打开和关闭

文件指针

1.每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE
2.每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。
3.一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便

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

文件的打开和关闭

  • ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件
  • ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件
//打开⽂件 
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件 
int fclose ( FILE * stream );

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

代码实例

#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("C:\\Users\\ASUS\\Desktop\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

文件的顺序读写

在这里插入图片描述

写字符

写字符函数:

int fputc ( const char * str, FILE * stream );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	fputc('a', pf);

	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

查看目录内容:
在这里插入图片描述

读取字符

读取字符函数原型:

int fgetc ( const char * str, FILE * stream );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	int ch = fgetc( pf);
	printf("%c", ch);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • 返回类型为 int 以适应特殊值 EOF,这表示失败.基于此,我们可以循环输出:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}
	printf("%c", ch);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

写一行数据

函数原型:

int fputs ( const char * str, FILE * stream );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	fputs("hello", pf);

	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • “w"模式会覆盖文件内容,可以尝试使用"a”
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "a");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写一行数据
	fputs("hello", pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

读取一行数据

函数原型:

char * fgets ( char * str, int num, FILE * stream );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//读取文件
	char arr[20];
	fgets(arr, 5,pf);
	printf("%s\n", arr);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • 读5个数据,真正读到的才4个,还有一个’\0’

格式化输出

函数原型:

int fprintf ( FILE * stream, const char * format, ... );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan",25,50.5f };

	FILE* pf = fopen("G:\\c_test\\test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	fprintf(pf, "%s %d %f", s.arr, s.age, s.score);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

格式化输入

函数原型:

int fscanf ( FILE * stream, const char * format, ... );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };

	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
	printf("%s %d %f", s.arr, s.age, s.score);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

二进制输出

函数原型:

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

代码实例:

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",25,50.5f };
	//以二进制形式写到文件中
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制的方式写
	fwrite(&s, sizeof(struct S), 1, pf);


	fclose(pf);
	pf = NULL;
}

在这里插入图片描述

二进制输入

函数原型:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { 0};
	//以二进制形式写到文件中
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制的方式读取
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.arr, s.age, s.score);



	fclose(pf);
	pf = NULL;
}

在这里插入图片描述

文件随机读写

  • 随机读写:不从首个位置开始,而可以选择任意位置

fseek

函数原型:

int fseek ( FILE * stream, long int offset, int origin );

文本内容:
在这里插入图片描述
代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	
	fseek(pf, 2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • SEEK_CUR就是在当前位置,在进行跳转

ftell

函数原型:

long int ftell ( FILE * stream );
  • 概念:返回文件指针相对于起始位置的偏移量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	printf("%d\n", ftell(pf));//3

	//fseek(pf, 2, SEEK_CUR);
	fseek(pf, -1, SEEK_END);
	ch = fgetc(pf);
	printf("%c\n", ch);
	printf("%d\n", ftell(pf));//6
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

rewind

函数原型:

void rewind ( FILE * stream );

  • 概念:返回到文件起始位置

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	rewind(pf);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

文本文件和二进制文件

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

文件读取和结束的判定

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

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

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

  • 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。例如:
    fread判断返回值是否小于实际要读的个数。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int c; // 注意:int,非char,要求处理EOF
    FILE* fp = fopen("test.txt", "r");
    if(!fp) {
        perror("File opening failed");
        return EXIT_FAILURE;
    }
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
    while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
    {
        putchar(c);
    }
    //判断是什么原因结束的
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

文件缓冲区

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

  • 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。如果不做,可能导致读写文件的问题。

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

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

相关文章

[Leetcode 61][Medium]-旋转链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律&#xff1a;当k大于等于链表中节点总数n时&#xff0c;会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时&#xff0c;无论k的值为多少都可以…

认识Mongodb及其Java的连接

什么是Mongodb&#xff1f; MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 优点 1.MongoDB的提供了一个面向文档存储&#xff0c;操作起来比较简单和容易。 2.如果负载的增加&#x…

Python中matplotlib使用4

在matplotlib中&#xff0c;可以通过绘制“饼图”来展示各类别在总体中所占的比例。 1 绘制基本“饼图” 通过matplotlib中的pie()函数绘制饼图&#xff0c;代码如图1所示。 图1 绘制基本“饼图”的代码 从图1中可以看出&#xff0c;pie()函数的参数y即为要绘制的数据&#…

使用SSMS连接和查询 SQL Server 实例

简介 SQL Server Management Studio 是用于管理SQL Server基础架构的集成环境。Management Studio提供用于配置、监视和管理SQL Server实例的工具。 此外&#xff0c;它还提供了用于部署、监视和升级数据层组件(如应用程序使用的数据库和数据仓库)的工具以生成查询和脚本。 官方…

现代RTK测量设备的高速发展及其应用前景

RTK&#xff08;实时动态定位&#xff0c;Real-Time Kinematic&#xff09;测量设备是利用GNSS&#xff08;全球导航卫星系统&#xff0c;Global Navigation Satellite System&#xff09;技术&#xff0c;通过引用基准站与移动站的数据传输机制&#xff0c;实现高精度的位置信…

基于spring boot的小型诊疗预约平台的设计与开发

TOC springboot262基于spring boot的小型诊疗预约平台的设计与开发 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

打靶记录12——Fawkes

靶机&#xff1a; https://download.vulnhub.com/harrypotter/Fawkes.ova这是个哈利波特系列的靶机&#xff0c;作者和本人都非常喜欢这个系列&#xff0c;因为它的漏洞和利用点都设计得很巧妙。 难度&#xff1a; 高 目标&#xff1a; 取得2个root权限 3 个flag 涉及攻…

Linux中的exec族函数

exec 系列函数用于替换当前进程的用户空间代码和数据&#xff0c;从而执行一个新的程序。调用 exec 系列函数不会创建新的进程&#xff0c;但会用新程序的代码和数据替换当前进程&#xff0c;因此调用 exec 后&#xff0c;进程的 ID 保持不变&#xff0c;但进程的行为变为执行新…

前端基础4

本节内容&#xff1a; 1.CSS的弹性布局&#xff0c;也称Flex布局 2.Vue2的生命周期 一、Flex布局 弹性布局是前端页面布局最常用的方式之一&#xff0c;通常使用四个属性。 1.创建盒子 先创建一个盒子并为其添加一些样式可以更直观的体验弹性布局&#xff0c;代码如下&#…

keepalived保活nginx1,nginx2

1 下载两个小玩意 yum -y install keepalived yum install psmisc -y 2 配置nginx1&#xff0c;2自启脚本 vim /root/shell/check-nginx.sh 我的脚本放在root/shell里 #!/bin/bash #获取nginx正在运行的进程数 npsnumps -C nginx --no-header | wc -lif [ $n…

企业级WEB应用服务器TOMCAT攻略

目录 一 WEB技术 1.1 HTTP协议和B/S 结构 二 WEB框架 2.1 web资源和访问 2.2 后台应用架构 三 tomcat的功能介绍 3.1 安装 Tomcat 3.2 tomcat的文件结构和组成 3.3 生成tomcat的启动文件 四 结合反向代理实现tomcat部署 4.1 常见部署方式介绍 4.2 利用 nginx 反向代…

第2章-01-网站中的资源介绍

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

性能测试-性能监控分析与调优(三)《实战-CPU瓶颈分析、内存问题分析、gc、tomcat性能调优,数据库监控-redis\mysql》

性能监控 使用命令监控 cpu瓶颈分析 top命令 在进行性能测试时使用top命令&#xff0c;界面如下 上图可以看出 - CPU 概况区&#xff1a; %Cpu(s): - us&#xff08;用户进程占用CPU的百分比&#xff09;, 和 sy&#xff08;系统进程占用CPU的百分比&#xff09; 的数…

热门奥运冠军代言费用贵,中小微企业怎么找冠军代言?

巴黎奥运会的热潮未退&#xff0c;这个月运动员代言的比例显著上升&#xff0c;比如游泳冠军潘展乐拿下携程等5个代言&#xff0c;孙颖莎手握可口可乐等7个代言。越来越多的企业和品牌通过冠军代言的形式来提升自身的品牌形象和市场竞争力。运动员代表着健康、拼搏和胜利&#…

thinkphp5漏洞分析之文件包含

目录 一、环境 二、开始研究 三、漏洞分析 四、漏洞修复 五、攻击总结 一、环境 thinkphp官网下载 创建 application/index/view/index/index.html 文件&#xff0c;内容随意&#xff08;没有这个模板文件的话&#xff0c;在渲染时程序会报错&#xff09; 二、开始研究 创…

【机器人学】7-2.六自由度机器人自干涉检测-计算圆柱体的上下圆心坐标【附MATLAB代码】

目录 前言 机械臂几何参数 机器等效圆柱体坐标确定 MATLAB代码 前言 上一章介绍了机器人自干涉检测的总体算法&#xff0c;提出了算法的三个核心&#xff1a; 一 根据机械臂的几何数据以及DH参数&#xff0c;确定机械臂等效的圆柱体的上下圆心坐标。 二 将一个圆柱体旋转到…

《少年白马醉春风》圆满收官 白澍“琅琊王”萧若风热度飙升

由陈宙飞执导&#xff0c;周木楠编剧&#xff0c;侯明昊、何与、胡连馨领衔主演&#xff0c;夏之光、姜贞羽特别出演&#xff0c;完颜洛绒、白澍等主演的古装武侠剧《少年白马醉春风》于昨日收官&#xff0c;大结局播出后&#xff0c;粉丝们直呼没看够&#xff01;对于剧中角色…

Qt Creator安装配置指南

1.官网下载在线安装包 官网地址&#xff1a; https://www.qt.io/download-dev#eval-form-modal 2.双击在线安装包按引导流程安装qt 3.选择自己要配置的qt环境版本 3.1如果要选中低版本的qt环境我这里安装的是qt5.15.2的(其他低版本也一样的)&#xff0c;要勾选上Archive(存…

vulnhub靶场 — NARAK

下载地址:https://download.vulnhub.com/ha/narak.ova Description:Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of Hell himself. Can you use your hacking skills to get out of the Narak? Burning walls and demons are around every cor…

AI安全-文生图

1 需求 2 接口 3 示例 大模型图像安全风险探析 - 先知社区 前言 文生图模型是一种新兴的人工智能技术,它通过对大规模文本数据的学习,能够生成逼真的图像。这种模型包含两个主要组件:一个文本编码器和一个图像生成器。 文本编码器接收文本输入,并将其转换为一种数字化的表示…