C语言——文件操作

⽬录

1. 什么是⽂件

2. 为什么使⽤⽂件

3. ⼆进制⽂件和⽂本⽂件

4. ⽂件的打开和关闭

5. ⽂件的顺序读写

6. ⽂件的随机读写

7. ⽂件读取结束的判定

8. ⽂件缓冲区


1.什么是文件

磁盘上的文件就是文件

在程序设计中,我们涉及到的 文件就2种:程序文件,数据文件(是以文件功能来划分的

1.1)程序文件

程序⽂件包括:源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。

1.2)数据文件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读,写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。

1.3)文件名

⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀

例如: c:\code\ test.txt

为了⽅便起⻅,⽂件 标识常被称为⽂件名。

2.为什么使用文件

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件。

3.二进制文件和 文本文件

数据的使用形式把数据文件划分为:二进制文件和 文本文件

数据 在内存上以二进制形式存储,在输出时不需要转换,就称之为二进制文件

在外存上以ASCII码的形式存储,需要在存储前需要转换,就称之为文本文件

一个数据是如何存储的?

C语言——文件操作_第1张图片

对于字符而言:一律用ASCII的形式存储:对于数值类型的:可以用ASCII也可以用对应的二进制

4.文件 的 打开和关闭

4.1流和标准流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河

⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后进行相应的操作

标准流

或许有人会有疑惑,那为什么我们在写程序 时,没有打开流呢???

C语言——文件操作_第2张图片

这是因为C语⾔程序在启动的时候,默认打开了3个流

stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。

stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。

stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

stdin、stdout、stderr三个流的类型是: FILE* ,通常称为⽂件指针

C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

4.2)文件指针

每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE.

⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,也就是说,通过⽂件指针变量能够间接找到与 它关联的⽂件。

C语言——文件操作_第3张图片

4.3)文件的打开与关闭

⽂件在读写之前应该先打开⽂件在使⽤结束之后应该关闭⽂件。 在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系,ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose函数 来关闭⽂件。

//打开⽂件

FILE * fopen ( const char * filename, const char * mode );   // 参数:FILE类型指针;对文件进行哪种操作

//关闭⽂件

int fclose ( FILE * stream );  

 fopen()  原型:

 第一个参数:要打开文件的名字   第二个参数:对这个文件进行什么操作

文件打开成功返回指向指向文件的地址,否则返回NULL

C语言——文件操作_第4张图片

注意:

1)当以 “w”  的方式进行操作时,若文件不存在,会自动建一个新的文件;若文件存在会清空原来的文件;总而言之就是建一个新的文件

2)在对文件操作时, 一定要用双引号,而不能用单引号

咱上代码

#include
int main()
{
	// 打开 data1.txt 这个文件(原来是有内容的)
	FILE* p = fopen("data1.txt", "w");  // 以写的方式打开
	if (p == NULL)
	{
		perror("fopen\n");  // 报错
	}
	// 关闭文件
	fclose(p);
	p = NULL;
	return 0;
}

程序运行前的:

 C语言——文件操作_第5张图片

程序运行后的:

 C语言——文件操作_第6张图片

5.文件的顺序读写

 5.1)文件顺序读写函数的介绍

C语言——文件操作_第7张图片

 以 fgetc() 为例:

fgetc() 函数原型:

C语言——文件操作_第8张图片

fgetc() 这个函数就相当于getchar() :它们都是每次只读一个字符,当有多个字符时,会自动读取上一个被读走字符的下一个字符 

既然有读取字符的那么就有输入字符的,比如我们的 fputc()

C语言——文件操作_第9张图片

 fputc()  参数:第一个是要输入的一个字符(注意要用单引号)

返回值:成功的话会返回被写入的字符会返回否则返回EOF(-1)

C语言——文件操作_第10张图片

#include
int main1()
{
	// 文件内容拷贝
	FILE* pread = fopen("data1.txt", "r");		// 以读的方式打开
	if (pread == NULL)
	{
		perror("fopen-1\n");
		return 1;
	}
	FILE* pwrite = fopen("data2.txt", "w");		// 以写的方式打开
	if (pwrite == NULL)
	{
		perror("fopen-2\n");
		fclose(pread);
		pread = NULL;
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pread)) != EOF)           // 功能:一次读一个字符   参数:文件类型指针   返回值:int
	{
		fputc(ch, pwrite);                      // 功能;一次写一个字符    参数:要写的内容;写在哪个空间
	}
	fclose(pread);
	pread = NULL;
	fclose(pwrite);
	pwrite = NULL;
	return 0;
}

其他的读写函数同他们是一样的,我相信会用fputc()  fgetc() ,剩下的咱也不在话下

C语言——文件操作_第11张图片

6. 文件的随机读写

6.1)fseek()

根据⽂件指针的位置和偏移量来定位⽂件指针

参数:

第一个是指向文件类型的指针;

第二个:偏移量

第三个是:起始位置(有3种情况)

C语言——文件操作_第12张图片

 C语言——文件操作_第13张图片

6.2) rewind() 功能:让文件指针的位置回到文件的起始位置

void rewind (FILE*stream)

C语言——文件操作_第14张图片

7.文件读取结束的标志

 7.1)feof

在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件是否结束

feof 的作⽤是:当⽂件读取结束的时候,判断文件读取结束的原因是否是:遇到⽂件尾结束。

⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

7.2)二进制文件

⼆进制⽂件的读取结束的判断:判断返回值是否⼩于实际要读的个数

8.文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的⼤⼩根据C编译系统决定的。

C语言——文件操作_第15张图片以上就是本次我要share 的一些内容,若有不足之处,欢迎各位大佬们随时指正

咱也就是说,既然都来到这了,劳驾各位大佬们动动手指,点个赞,互关一下呗,赠人之赞,手留余香!!!

C语言——文件操作_第16张图片

你可能感兴趣的:(c语言,开发语言,c++)