C语言知识点---文件

发布于:2022-11-08 ⋅ 阅读:(796) ⋅ 点赞:(0)

目录

一、为什么使用文件

二、什么是文件

2.1程序文件

2.2数据文件

2.3文件名

三、文件的打开与关闭

3.1文件指针

3.2fopen函数

3.3fclose函数

四、文件的顺序读写

4.1文件读写的思路

4.2流(stream)【理解不多】

4.3输入输出流相关函数


一、为什么使用文件

目的是:存储程序运行过程中产生的数据

使用文件我们可以将数据直接存放在电脑的硬盘上,做到数据的持久化。

数据持久化的方法:将数据存放在磁盘文件、存放到数据库中

二、什么是文件

文件:磁盘上的文件

在程序设计中,我们一般分为两种:程序文件、数据文件(按照文件功能分类)

2.1程序文件

1.源程序文件:后缀为.c

2.目标文件:windows环境下后缀为.obj【编译时临时产生的】

可执行程序:windows环境下后缀为.exe

2.2数据文件

文件的内容不一定是程序,而是程序运行时读写的数据

2.3文件名

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

文件名包括三个部分:文件路径+文件名主干+文件后缀

为了方便起见,文件标识被称为文件名

三、文件的打开与关闭

3.1文件指针

每个被使用的文件都在内存开辟了一个相应的文件信息区,用来存放文件的相关信息(包括文件的名字、文件状态以及文件在当前的位置等)。

文件信息区其实是一个结构体变量,结构体的类型是FILE,该结构体是由系统声明的

例如:VS2022编译环境下文件类型的声明:

typedef struct _iobuf
{
	//结构体成员
	//......
}FILE;

注意:不同编译环境下结构体FILE包含的内容略有差异;

使用过程:每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充信息,一般是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来比较方便;

通过文件指针变量可以找到与他关联的文件

文件在读写之前应该先打开文件,使用结束以后应该关闭文件

ANSIC规定使用fopen函数来打开文件,fclose函数来关闭文

3.2fopen函数

功能:open a file

需要的头文件:

fopen函数:<stdio.h>

_wfopen函数:<stdio.h> or <wchar.h>

函数声明:

file* fopen(const char* fliename,const char* mode);   //mode是打开方式

可选的打开方式:

"r": 只读,前提是文件存在,文件不存在就会报错

"w":只写,打开一个空的文件,当文件有内容时,原内容被销毁

"a":增补,在文件末尾增加内容

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	printf("\t\t\033[5;31;43mC语言学习-文件模块\033[m\n");
	printf("\n");
	printf("\n");
	printf("\n");
	//新建一个FILE类型的指针接收fopen函数的返回值
	FILE* pfile = fopen("test.docx", "w");  //打开失败,返回空指针,打开成功返回一个文件类型的指针
	if (pfile == NULL)
	{
		perror("fopen:");       //perror头文件是<stdio.h>
		return;
	}
	fclose(pfile);
	pfile = NULL;
	return 0;
}

绝对路径:目录下的绝对位置,直接到达目标位置,一般从盘符开始

"D:\桌面\研究生\00软件学习\01C语言学习\比特课堂\14文件\fileyes\test.docx"

注意:以绝对路径的方式打开文件时,要对"\"前面添加一个"\",防止"\"将后面的内容转义

"D:\\桌面\\研究生\\00软件学习\\01C语言学习\\比特课堂\\14文件\\fileyes\t\est.docx"

适用于文件不和解决方案处于同一个文件夹的情况;

相对路径:从当前路径开始的路径,在使用过程中有很多便利

适用于文件和解决方案处于同一个文件夹的情况;

3.3fclose函数

功能:close a stream(fclose) or closea all open stream(_fcloseall)

需要的头文件:

fclose函数:<stdio.h>

_fcloseall函数:<stdio.h> 

函数声明:

int fclose(FILE* stream);  //函数参数是指向待操作文件文件信息区的FILE类型的指针

返回值:

fclose:返回0,说明文件成功关闭。返回EOF,说明遇到一个错误

_fcloseall:返回n,说明n个文件被关闭。返回EOF,说明遇到错误

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	printf("\t\t\033[5;31;43mC语言学习-文件模块\033[m\n");
	printf("\n");
	printf("\n");
	printf("\n");
	//新建一个FILE类型的指针接收fopen函数的返回值
	FILE* pfile = fopen("test.docx", "w");  //打开失败,返回空指针,打开成功返回一个文件类型的指针
	if (pfile == NULL)
	{
		perror("fopen:");       //perror头文件是<stdio.h>
		return;
	}
	fclose(pfile);
	pfile = NULL;
	return 0;
}

关闭文件后,要将原文件指针置空;

四、文件的顺序读写

4.1文件读写的思路

在打开文件的时候,可以选择打开的方式

当选择只读时,无法修改文件内容

当选择只写时,可配合其他函数(如fputs函数)向文件内输入内容

4.2流(stream)【理解不多】

运行程序的过程中,会涉及到数据的输入和输出

输入的来源:键盘、文件、U盘、软盘......

输出的对象:控制台、文件、U盘、软盘等......

程序默认打开了三个流,分别是标准输入流stdin、标准输出流stdout、标准错误流strerr

就比如在屏幕上显示单个字符:

    fputc('w', stdout);    //stdout 是标准输出流到屏幕上

如果想使用其他流的话,必须首先声明

就比如:输出单个字符到文件中:

需要先定义一个指向文件信息区的FILE类型的指针pfile,并设置打开方式:

FILE* pfile = fopen("test.txt", "w"); 

然后才可以向文件中写入数据:

    fputc('w',  pfile);    //前面是字符,后面试你要输出的对象

在这两个小例子里面,stdout和pfile都是FILE类型的指针,都是流

4.3输入输出流相关函数

相关函数

功能 函数名 适用于 字符输入函数 fgetc 所有输入流 字符输处函数 fputc 所有输出流 文本行输入函数 fgets 所有输入流 文本行输出函数 fputs 所有输出流 格式化输入函数 fscanf 所有输入流 格式化输出函数 fprintf 所有输出流 二进制输入 fread 文件 二进制输出 fwrite 文件

文本输入函数:就像上个小节一样使用的那样,按照ASCII值输入输出

1.fgets函数

头文件:<stdio.h>

功能:get a string from a stream

函数声明:char* gets(cahr* string,int n,FILE* stream);  //n是最多读取的字符个数,包括\0

使用代码:

	FILE* pfile = fopen("test.txt", "r");  //打开失败,返回空指针,打开成功返回一个文件类型的指针
	if (pfile == NULL)
	{
		perror("fopen");       //perror头文件是<stdio.h>
		return;
	}
	char arr[10] = { 0 };
	fgets(arr, 5, pfile);
	printf("%s\n", arr);
	fgets(arr, 2, pfile);
	printf("%s\n", arr);
	fclose(pfile);
	pfile = NULL;
	return 0;

需要注意的是:读取完一次,接着读取时,会接着读取后面的字符,意思是位置标识符会后移

格式化输入输出函数:

比如存储结构化的数据:

1.fprintf函数

功能:将结构化的数据(例如结构体)写入到文件(流)中

函数声明:int fprintf(FILE* stream,const char* format[,argument]...);

使用方法:与printf函数相比就是多一个文件指针的参数,其余一模一样;

代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	
	FILE* pfile = fopen("test.txt", "w");
	if(pfile==NULL)
	{
		perror("fopen");     
		return;
	}
	struct S s = { "haha",101,13.14f };
	fprintf(pfile, "arr   num   sc\n");

	fprintf(pfile, "%s %d %f", s.arr, s.num, s.sc);
	//fputs("haha", pfile);

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

2.fscanf函数

功能:将文件中结构化的数据(例如结构体)读入到程序中

函数声明:int fscanf(FILE* stream,const char* format[,argument]...);

使用方法:与scanf函数相比就是多一个文件指针的参数,其余一模一样;

代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

struct S
{
	char arr[10];
	int num;
	float sc;
};
int main()
{
	
	FILE* pfile = fopen("test.txt", "r");
	if(pfile==NULL)
	{
		perror("fopen");     
		return;
	}
	struct S s = { 0 };
	fprintf(pfile, "arr   num   sc\n");

	//fprintf(pfile, "%s %d %f", s.arr, s.num, s.sc);
	//fputs("haha", pfile);

	fscanf(pfile, "%s %d %f", s.arr, &(s.num), &(s.sc));
	printf("%s %d %f", s.arr, s.num, s.sc);

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

要定义一个结构体变量接收从文件中读取的信息;

二进制输入输出:

1.fwrite函数

功能:writes data to a stream

函数声明:size_t fwrite (const void* buffer,size_t size,size_t count,FILE*stream)

参数解释:

1.buffer:指向待写入的数据

2.size:数据元素的大小,单位是字节

3.count:被写入数据的个数

代码演示:

FILE* pfile = fopen("test.txt", "w");
	if(pfile==NULL)
	{
		perror("fopen");     
		return;
	}
	struct S s = { "hsk",23,521.0 };
	fwrite(&s, sizeof(s), 1, pfile);
	fclose(pfile);
	pfile = NULL;
	return 0;

1.fread函数

功能:read data from a stream

函数声明:size_t fread (void* buffer,size_t size,size_t count,FILE*stream)

参数解释:

1.buffer:读入的数据写入的地址

2.size:数据元素的大小,单位是字节

3.count:读入数据的个数

代码使用:

从文件中读取二进制数据,保存到一个同类型的结构体中

FILE* pfile = fopen("test.txt", "r");
	if(pfile==NULL)
	{
		perror("fopen");     
		return;
	}
	struct S s = { 0 };


	fread(&s, sizeof(s), 1, pfile);
	printf("%s %d %f", s.arr, s.num, s.sc);
	fclose(pfile);
	pfile = NULL;
	return 0;

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到