admin管理员组

文章数量:1558087

文章目录

  • 一 什么是文件?
    • 1.1文件的概念
    • 1.2为什么使用文件
    • 1.3文件的种类
  • 文件的打开与关闭
    • 2.1 流的概念
    • 2.2 文件指针 **FILE***
    • 2.3文件的打开与关闭
  • 文件的读和写
    • 3.1写文件
      • ①**fput**
      • ②**fputs**
      • ③**fprintf**
    • 3.2读文件
      • ①fget
      • ②**fgets**
      • ③**fscanf**
    • 3.3二进制写文件
        • **fwrite**
    • 3.4二进制读文件
        • **fread**

一 什么是文件?

1.1文件的概念

 文件是指存储在外部存储介质(外存,如:U盘、光盘、硬盘等等)上
 数据的集合。操作系统是以文件为单位对数据进行管理的。C语言将每
 一个与主机相连的输入或输出设备都看做是一个(广义的)文件。用文
 件可以长期保存数据,实现数据共享。

1.2为什么使用文件

可以对数据进行保存,当我们使用程序编写数据时是存储在电脑的内存中,当程序退出时,内存回收,这些数据也就随之消失,这时使用文件可以来保存我们的数据。

1.3文件的种类

文件分为数据文件和文本文件,本文讨论数据文件。

文件的打开与关闭

2.1 流的概念

流可以抽象为数据流 流是抽象出来的概念

我们在c语言中 直接使用scanf printf是因为c语言已经默认打开了三个流
•stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。
• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这些流的类型都是 FILE*

2.2 文件指针 FILE*

打开文件时 会在内存中生成文件信息区 生成FILE的结构体变量
最后返回起始地址 即FILE*的指针类型

2.3文件的打开与关闭

ANSIC 规定使用 fopen 打开文件 使用 fclose关闭文件

FILE * fopen ( const char * filename, const char * mode );
函数返回FILE*                文件名                打开模式
⽂件使⽤⽅式含义如果指定⽂件不存在
“r”(只读)为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件
int main()
{
	//打开文件
	FILE* pf=fopen("data", "w");
	//我并没有创建data文件 
	//以“w”的方式打开之后 会生成文件
	if (pf == NULL)
	{
		perror("fopen");
		return ;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}


当我删除该文件时,以“r”的模式打开

FILE* pf=fopen("data", "r");

会出错

文件的读和写

函数名功能适⽤于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输出流
fread⼆进制输⼊⽂件

3.1写文件

fput

	//打开文件
	FILE* pf = fopen("data", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return ;
	}
	//写文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);

此时data文件内存放的就是abcd



当然fputc也可以像屏幕中打印出abcd

int main()
{
	fputc('a', stdout);
	fputc('b', stdout);
	fputc('c', stdout);
	fputc('d', stdout);

	return 0;
}

fputs

fputs 是打印一行 可以是字符串 也可以是数组

fprintf

struct S
{
	float a;
	char b;
	int c;
};
int main()
{
	struct S s= { 3.14f,'w',100 };
	//打开文件
	FILE* pf = fopen("data", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	fprintf(pf,"%f %c %d", s.a, s.b, s.c);
	//	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3.2读文件

①fget

int main()
{
	//打开文件
	FILE* pf = fopen("data", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return ;
	}
	//写文件
	int ch = fgetc(pf);
	printf("%c ", ch);

	 ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);

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

fgets

char* fgets(char* str, int num, FILE * stream);
str是将读取的数据放到数组str中     
num是最大读取(num-1)个
FILE * stream就是 pf
int main()
{
//打开文件
	FILE* pf = fopen("data", "r");
		if (pf == NULL)
		{
			perror("fopen");
			return ;
		}
//读文件
	char arr[100] = { 0 };
	fgets(arr,100,pf);
	printf("%s", arr);
	//	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fscanf

fscanf(pf, "%f %c %d", &(s.a),& (s.b), &(s.c));

3.3二进制写文件

fwrite
fwrite(void* ptr, size_t size, size_t count, FILE* stream);
         要的数组     数组每个元素大小  个数      pf
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	FILE* pf = fopen("data", "wb");
	if (pf == NULL)
		{
			perror("fopen");
			return;
		}
	fwrite(arr, 4, 10, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

此时文件内容如下

看不懂 那么由二进制读就可以看懂了

3.4二进制读文件

fread
fread(void* ptr, size_t size, size_t count, FILE* stream);
         要读的数组     数组每个元素大小  个数      pf
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	FILE* pf = fopen("data", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	fread(arr, 4, 10, pf);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}


博主会在后续文章中更新剩余部分,如果有好的建议欢迎在评论区提出

本文标签: 详解语言操作文件