C语言-文件操作相关函数介绍

文件操作基础知识

 程序打开文件时,会维护一个文件指针,文件指针指向一个FILE的结构体(也叫文件信息区)通过文件信息区与文件之间的交互实现相关文件操作。

 C语言在开始运行时,会默认打开三个流

1.标准输入流---stdin--->用于读取数据

2.标准输出流---stdout--->用于写入数据

3.标准错误流---stderr

文件操作相关函数

fopen-打开文件函数

//打开文件
	//注意:程序只能有一种打开方式,这里只是为了方便说明问题将 读和写 写到了一起
	//fopen("文件名","打开方式")
	FILE* pf = fopen("data.txt", "w");//以写的形式打开-注意,如果是二进制输出则要用wb
	//如果以写的形式打开,如果目前没有创建这个文件,则会自动创建文件并打开它
	FILE* pf = fopen("data.txt", "r");//以读的形式打开-注意,如果是二进制输入则要用rb
	//如果以读的形式打开,如果目前没有创建这个文件,则会打开失败
	//如果文件打开失败,则文件指针会返回空指针
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}

fclose-关闭文件函数

//关闭文件
	//fclose(文件指针)--释放文件指针之后我们需要将文件指针制空,防止成为野指针
	fclose(pf);
	pf = NULL;

fgetc-字符输入函数

//打开文件
	FILE* pf = fopen("data.txt", "r");//以读的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//字符输入函数
	int n = fgetc(pf);
	printf("%c\n",n);
	//我们从pf所指的文件中读取数据到n中去,再将n以字符形式打印
	//关闭文件
	fclose(pf);
	pf = NULL;

fputc-字符输出函数

//打开文件
	FILE* pf = fopen("data.txt", "w");//以写的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//字符输出函数
	//fputc('需要写入的字符',文件指针)
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	//我们依次将abcd字符写入pf文件指针所指的文件中过去
	//关闭文件
	fclose(pf);
	pf = NULL;

fgets-文本行输入函数

//打开文件
	FILE* pf = fopen("data.txt", "r");//以读的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//文本行输入函数
	char a[10] = { 0 };
	//fgets(数组,读取n个,文件指针)
	//注意:这里的n指的是读取的个数,但实际上只会读取到前n-1个,会将第n个改为 '\n' 
	//所以fgets的结束有两种方式
	//1.读取了n-1个数据,将第n个改为 '\n'结束
	//2.读取n个的过程中,读到了'\n'结束
	fgets(a, 3, pf);
	//我们将pf所指的文件中的数据的前三个输入到a数组中去
	printf("%s\n",a);
	//关闭文件
	fclose(pf);
	pf = NULL;

fputs-文本行输出函数

//打开文件
	FILE* pf = fopen("data.txt", "w");//以写的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//文本行输出函数
	//fputs("所要书写的内容",文件指针)
	fputs("xxxxx", pf);
	//我们将xxxxx字符串写入pf所指的文件中去
	//关闭文件
	fclose(pf);
	pf = NULL;

fscanf-格式化输入函数

struct S {
	int x;
	float y;
	char z;
};
int main() {
	//打开文件
	FILE* pf = fopen("data.txt", "r");//以读的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//格式化输入函数
	struct S s1;
	//fscanf(文件指针,"%d %f %c",&(s1.x),&(s1.y),&(s1.z))
	fscanf(pf, "%d %f %c", &(s1.x), &(s1.y), &(s1.z));
	printf("%d %f %c\n",s1.x,s1.y,s1.z);
	//我们将pf所指的文件中的数据以%d %f %c的形式写到s1结构体中去,之后将其打印
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fprintf-格式化输出函数

struct S {
	int x;
	float y;
	char z;
};
int main() {
	//打开文件
	FILE* pf = fopen("data.txt", "w");//以写的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//格式化输出函数
	struct S s1 = {10,3.14,'a'};
	//fprintf(文件指针,"%d %f %c",)
	fprintf(pf, "%d %f %c", s1.x, s1.y, s1.z);
	//我们将s1这个结构体中的数据以%d %f %c这种格式写到pf所指的文件中去
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

sprintf函数

struct S {
	int x;
	float y;
	char z;
};
int main() {
	//sprintf函数
	//sprintf(接受的空间,"%d %f %c",读取内容处)
	char arr[20];
	struct S s1 = { 10,3.14,'a' };
	sprintf(arr, "%d %f %c", s1.x, s1.y, s1.z);
	printf("%s\n",arr);
	//我们将s1结构体中的数据以%d %f %c的形式放到arr数组中去(以字符形式存储),之后将其打印
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

sscanf函数

struct S {
	int x;
	float y;
	char z;
};
int main() {
	//sscanf函数
	//sscanf(读取内容处,"%d %f %c",接收空间地址)
	char arr[20] = "10 3.140000 a";
	struct S s2 = { 0 };
	sscanf(arr, "%d %f %c",&(s2.x),&(s2.y),&(s2.z));
	printf("%d %f %c\n",s2.x,s2.y,s2.z);
	//我们将arr数组中的数据以%d %f %c的形式放到s2结构体中去,之后将其打印
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fwrite-二进制输出函数

struct S {
	int x;
	float y;
	char z;
};
int main() {
	//打开文件
	FILE* pf = fopen("data.txt", "wb");//以读的形式打开
	if (pf == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	//二进制输出函数
	struct S s1 = { 10,3.14,'a' };
	//fwrite(输入数据的地址,所占空间大小,个数,文件指针)
	fwrite(&s1, sizeof(s1), 1, pf);
	//我们将s1结构体中的数据,写到pf所指向的文件中去
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fread-二进制输入函数

struct S {
	int x;
	float y;
	char z;
};
int main() {
	//打开文件
	FILE* pf = fopen("data.txt", "rb");//以读的形式打开
	if (pf == NULL) {
	perror("fopen fail");
	exit(-1);
	}
	//二进制输出函数
	struct S s1;
	//fread(被写入空间的地址,所占空间大小,个数,文件指针)
	fread(&s1, sizeof(s1), 1, pf);
	printf("%d %f %c\n", s1.x, s1.y, s1.z);
	//我们将pf指针所指向的文件中的内容,写到&s1地址所指的空间中去,打印查看结果
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

对比scanf/fscanf/sscanf函数

scanf:从键盘获取数据----------------------------------------------------------------------------->从键盘获取

fscanf:从文件中去读取格式化数据并赋值给相应的结构体变量中---------->从文件到结构体变量

sscanf:从数组中获取相应的格式化数据赋值到结构体变量中---------------->从数组到结构体变量

对比printf/fprintf/sprintf函数

printf:向屏幕输出想要的格式化的数据------------------------------------------------------>写到屏幕上去

fprintf:向文件指针所指的文件中书写格式化的数据------------------------------>从结构体写到文件上

sprintf:将格式化的数据输出到一个数组中去并以数组的形式存储起来----------->从结构体到数组

我们也可在写的状态下使用stdout将数据写到屏幕上,在读的状态下使用stdin从键盘中获取数据。

最后,如有不足,请各位大佬指正!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值