【C语言】文件操作


前言

本节课讲的是文件操作


提示:以下是本篇文章正文内容,下面案例可供参考

一、文件操作的大概过程

文件及文件操作介绍
什么是文件? 磁盘中的各种文件,图片文件(jpg,png,bmp,gif…),文本(doc,txt,dot,rtf,doct,wps,wpt, pdf,c,cpp,html,css,py…),其他(zip,7z,exe,msi,dll,lib,apk…)无数种文件类型,这些都是文 件,文件操作就是操作这些文件
不同的文件区别? 不同的文件存储的数据类型不同,文件内存储数据的格式不同

文件操作流程:
流程:操作流程:打开文件,读写操作,关闭文件

二、打开与关闭文件

打开文件:FILE * = fopen(“文件路径”,打开模式):旧 与errno_t = fopen_s(FILE*,“文件路径”,“打开模式”)函数:新

	//打开文件
	//旧
	FILE* pile1 = fopen("mytxt.txt", "r");
	//参数1:文件的路径(绝对/相对)参数2:打开方式
	//新
	FILE* pfile2 = NULL;//新版是通过传址调用,所以需要先定义FILE类型的指针
	errno_t e = fopen_s(&pfile2, "mytxt2.txt", "r");//参数1为传址调用,其他不变

FILE* 文件指针介绍:
FILE:文件类型,,就是文件指针,打开文件的本质就是将文件内容存进文件缓冲区,FILE 可以理解为文件缓冲区首地址。随着操作,文件指针偏移,指向哪儿就从哪儿开始操作。 返回值:旧函数直接返回文件操作地址。新函数通过参数 1 的传址调用获得文件地址

文件路径介绍:
相对路径:默认相对于项目文件所在目录,写个名字即可
绝对路径:完整路径名

打开方式介绍

文本模式: "r"/"rt" 只读,只能调用读函数,文件必须存在,否则失败。文件指针指向头字节。
"r+" 可读可写读,读写函数都能调用,文件必须存在,否则失败。文件指针指向头字节。 
"w"/"wt" 擦除写,只能调用写函数,文件不存在时创建文件。文件指针指向头字节。 
"w+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向头字节。 
"a"/"at" 附加写,只能调用写函数,文件不存在时创建文件。文件指针指向尾字节。 
"a+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向尾字节。 

二进制模式: "rb" 只读,只能调用读函数,文件必须存在,否则失败。文件指针指向头字节。
"rb+" 可读可写读,读写函数都能调用,文件必须存在,否则失败。文件指针指向头字节。 
"wb" 擦除写,只能调用写函数,文件不存在时创建文件。文件指针指向头字节。 
"wb+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向头字节。
"ab" 附加写,只能调用写函数,文件不存在时创建文件。文件指针指向尾字节。
"ab+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向尾字节。

二进制模式与文本模式的区别:对文件行结尾代码层面处理不同,在 windows 系统中,行结尾是\r\n,文本模式读到的是\n,二 进制模式读到的是\r\n 在 linux 系统下都是\n,没有区别。

fopen_s返回值介绍:
类型为erron_t

如果他的返回值不为0,则打开文件失败

if(e!=0&&pfile==NULL)//判断文件指针是否为NULL也是一种方法
{
	printf("文件打开失败\n");
}

关闭文件:fclose(FILE*)
为什么要关闭文件?
默认情况下不能打开两次

fclose(pfile);

三、读写操作fputc、fgetc、feof

fputc、fgetc

写入一个字节:int = fputc(字符,文件指针)
.int a = fputc('a', pfile2);//把参数1写入参数2的文件中,返回ascii整数
读取一个字节int = fgetc(文件指针);
.int b = fgetc(pfile2);//读取参数中一个字符,文件指向向下移动1格
返回值为读取出的字符的ascii整数,使用"%c"打印

注意:注意:取用r 写用a/w

int a = fputc('a', pfile2);//把参数1写入参数2的文件中,返回ascii整数
int b = fgetc(pfile2);//读取参数中一个字符,文件指向向下移动1格

feof

当读到文件结尾时,返回真
bool = feof(文件指针);
循环读文件

while (1) 
{ 
	int a = fgetc(pFile);
	if (feof(pFile))
  		break;
 	putchar(a); 
}

四、读写操作fputs、fgets

写入n个字节:fputs(要写入的字符串,文件指针)
读取n个字节:fgets(存储读取出来的字符串,读出的字节数,文件指针);

//读取n个字符
fputs("hello 文件操作", pfile2);//写入参数1到文件中
char str[20] = { '\0' };
fgets(str, 20, pfile2);//读取文件20个字符,存到str中

五、格式化读写字符串 fprintf,fscanf,fscanf_s

格式化写入字符串:fprintf(文件指针,“输出格式符”,数据) 把数据格式化后写入文件指针中,输出格式符要对应数据

格式化读取字符串:fscanf(文件指针,“输入格式符”,存储变量);
fscanf_s()---->与scanf和scanf_s的区别一样,字符串需要写字节数

	//写
	fprintf(pfile2, "a:%d, b:%lf,s:%s", 12, 45.6, "hello c3"); //格式化字符串写入文件

	//读
	int a = 0; 
	double b = 0.0; 
	char str[20] = { 0 }; 
	fscanf_s(pfile2, "a:%d, b:%lf,s:%s", &a, &b, str, 20); //成对使用,新版 
	fscanf(pfile2, "a:%d, b:%lf,s:%s", &a, &b, str); //老版
	//注意:读和写的格式化字符要对应

注意:读和写的格式化字符要对应,很重要,要不然会读乱

六、二进制读写数据fread、fwrite

什么场景使用他们:都是数据的时候

为什么要使用他们:比如 12 这个整数,前三组就是存入的字符 1 2 。而最后一组存 00001100 存入 1 字节。 所以数值类型的数据存储,可以直接使用 fread fwrite,比前三者效率高,因为前三者要 先转换,然后存

写入:fwrite(写入数据的地址,大小,写入的次数,文件指针);
读取:fread(存储数据的地址,大小,读取的次数,文件指针);

	struct Node
	{
		int a;
		double b;
		char c[10];
	};
	//写入结构体node
	struct Node node = { 10,20.22,"你好" };
	fwrite(&node, sizeof(node), 1, pfile2);//写入的结构体地址、结构体大小,写入的次数,文件指针

	//fread读取二进制到程序中
	//读取结构体node
	struct Node read_node;
	fread(&read_node, sizeof(read_node), 1, pfile2);//取出的结构体地址、结构体大小,读出            			 	的个数的次数,文件指针
	//打开文件看到的就是乱码了,但是在程序中看就是写入的东西了

七、文件操作函数

rewind

将文件指针指向文件首:
rewind(文件指针)

ftell

返回文件指针指向的文件中的字节下标
long = ftell(文件指针)
返回值为long类型,他为文件指针指向的下标

fseek

设置文件指针指向哪个字节,成功返回 0
fseek(文件指针,相对位置,从哪开始走)
参数3详解:

SEEK_SET 文件首,配合参数 2,比如 3,就是首+3 的位置,即第四个字节
SEEK_END 文件尾,配合参数 2,比如-3,就是结尾-3 的位置,即倒数第四个字节
 SEEK_CUR 当前位置,配合参数 2,负数左移,正数右移。

大家可以挑选自己需要的使用


总结

本文讲了:打开文件、路径是什么、打开模式的挑选、读写的几种方式(fputc、fgetc、fputs、fgets、fprintf、fscanf、fscanf_s以及二进制读写fread、fwrite)、文件操作函数(rewind、ftell、fseek)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值