【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)

【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第1张图片

前言

在之前的学习过程中,我们所编写的程序在执行过程中所产生的数据及结果都只是临时存放在内存区域,一旦程序运行结束,该程序所涉及的内存空间全部返回给操作系统。这时候如果我们想要去查看这些数据和结果,显然是做不到的!那有没有什么方法能够解决这个问题呢?也就是说可以将程序运行过程所产生的过程数据和结果数据都保存起来,即便程序结束,我们也可以找到这些内容,甚至是在之后所写的其他程序中也能继续使用这些内容。
答案当然是-- - 有,这也就是我们这篇文章所要讨论的东西–文件。


文章目录

    • 前言
      • 为什么需要文件?
      • 什么是文件?
    • 文件名
    • 文件缓冲区
    • 文件指针
    • 文件的打开和关闭
      • fopen
      • fclose
    • 流(stream)的概念
    • 对比一组函数:
    • 文件随机读取
    • fseek函数
    • ftell函数
    • rewind
    • 文件类型
    • 文件读取结束的判定


为什么需要文件?

这个问题其实刚刚已经说到了,简而言之,我们需要文件是
(1)防止程序结束后,数据就消失了
(2)为了持久化的保存数据


什么是文件?

计算机中所说的文件是以计算机硬盘为载体,存储在计算机上的信息集合。例如我们熟悉的文本文件,图片文件,视频文件,程序等等。
文件有各种各样的类型,但是在程序设计中,我们一般谈的文件有两种∶程序文件、数据文件
(1)程序文件
包括源程序文件(后缀为.c ), 目标文件(windows环境后缀为.obj), 可执行程序(windows环境后缀为.exe)。
(2)数据文件
文件的内容不是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
本章讨论的是数据文件。
在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。


文件名

如果我们要区分不同的人,很多时候需要通过他 / 她的名字来进行区分;如果要区分不同的物品,也要通过不同的物品名称来区分一样。所以为了区分不同的文件,也需要给不同的文件不同的名称一样。
一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分∶文件路径 + 文件名主干 + 文件后缀
例如︰c : \code\test.txt
文件路径:c : \code
文件名主干:test
文件后缀:.txt

为了方便起见,文件标识常被称为文件名。但是我们要了解此时所称呼的文件名,实际上包括以上3部分内容,而不仅仅是文件名主干。

1) 文件名主干的命名规则遵循标识符的命名规则。
2)后缀用来表示文件的性质, 如:doc(Word生成的文件), txt(文本文件),dat(数据文件), c(C语言源程序文件)'cpp(C++源程序文件), for(FORTRAN语言源程序文件),pas(Pascal语言源程序文件),obj(目标文件), exe(可执行文件).ppt(电子幻灯文件), bmp(图形文件)等。
3)文件路径:分为相对路径和绝对路径
绝对路径:c : \code\test.txt
相对路径:test.txt


文件缓冲区

ANSIC标准采用"缓冲文件系统"处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块"文件缓冲区"。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第2张图片


文件指针

缓冲文件系统中, 关键的概念是“文件类型指针”, 简称“文件指针”。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。
该结构体类型是由系统声明的,取名为FILE。

例如VS2013编译环境提供的stdio.h头文作中有以下的文件类型声明:

struct _iobuf
{
   
	char* _ptr;
	int  _cnt;
	char* _base;
	int  _f1ag;
	int  _file;
	int _charbuf;
	int _bufsiz;
	char* _tmpfname;
};
typedef struct _iobuf FILE;

(注意:以上代码了解即可,有兴趣可自行研究) 不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。 下面我们可以创建─个FILE* 的指针变量:

FILE * pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第3张图片


文件的打开和关闭

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

fopen

函数原型:FILE* fopen(const char* filename, const char* mode);
函数功能:Open a file.(打开文件)
返回类型:Each of these functions returns a pointer to the open
file.A null pointer value indicates an error.(如果打开成功,返回指向文件信息区的指针,如果返回失败,返回空指针NULL)
函数参数1:filename(文件名,实际上包括3部分内容,而不仅仅是文件名主干。如果文件路径未写,则默认本路径)
函数参数2:Type of access permitted(文件打开方式)

文件打开方式如下表:
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第4张图片

注意:‘w’打开的时候如果有同名文件,该文件中的内容会被销毁

fclose

函数原型:int fclose(FILE* stream);
函数功能:Closes a stream(fclose) or closes all open streams(_fcloseall).(关闭文件)
返回类型:fclose returns 0 if the stream is successfully closed._fcloseall returns the total number of streams closed.Both functions return EOF to indicate an error(关闭文件成功返回0,关闭文件失败返回EOF(值为 - 1)来报错)
函数参数:Pointer to FILE structure(文件指针)

举例:
1)在项目工程所在文件路径下新建一个测试文件
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第5张图片
2)测试代码

#include
int main()
{
   
	//打开文件
	FILE* pf1 = fopen("test1.txt", "r");
	if (pf1 == NULL)
	{
   
		perror("fopen");
		return 1;
	}
	//写文件
	//......
	//关闭文件
	fclose(pf1);
	return 0;
}

3)文件打开结果
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第6张图片
调整一下(为了进一步理解相对路径和绝对路径,这里的filename使用绝对路径的方式)
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第7张图片
刚刚我们是以“读”的方式来打开文件,现在我们来尝试用“写”的方式来打开文件

#include
int main()
{
   
	FILE* pf = fopen("file1.dat", "w");
	if (pf == NULL)
	{
   
		perror("fopen");
		return 1;
	}
	//写文件
	//... 
	printf("open file success!\n");
	//关闭文件
	fclose(pf);
}

在我们刚刚的路径下是没有file1.dat这个文件的,因为我们用“w”的方式打开文件,所以会创建一个新的文件
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第8张图片
【C语言进阶学习笔记】六、详解文件操作(看完这篇,你的文件操作就入门了!)_第9张图片
现在我们来尝试将一些内容写入到打开的文件中:

你可能感兴趣的:(C语言编程学习,c语言)