当前位置:网站首页>C语言——文件操作详解(1)

C语言——文件操作详解(1)

2022-08-11 05:16:00 云逸943

        前言             

       在初学编程语言的时候,我们写出来的项目、程序都是一次性的,写好的代码经过编译运行出来后,实现自己所编写的功能,但是每次实现代码功能时,所填写的信息都会随着代码调试的结束而被销毁,无法保存下来,这并不好,所以那时候的开发人员为了编写程序的信息能够长久的保存下来,为计算机语言创建了文件系统,这便是我们需要使用到文件的原因。

        我们在想既然是通讯录、日记这些在生活中常常要用到的东西,就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据 库等方式。 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的长久保存效果。

目录           

一.文件的定义

        1.什么是文件?

        2.文件的名称

        3.文件路径

二.文件的打开与关闭

        1.文件指针

        2.打开与关闭函数 

        3.打开和关闭的使用

        4.代码实践:


一.文件的定义

        1.什么是文件?

        我们在使用计算机的时候,会看见有两到三个磁盘,这是内存盘,是专门用来存放文件的,文件从功能上来看,大致分为两种:程序文件和数据文件。

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

        数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 或者输出内容的文件。数据文件可以是任何类型的,例如.word文件、.excel文件、.txt文件......  而今天我们主要关注数据文件。

       2.文件的名称

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

        文件名包含3部分:文件路径+文件名主干+文件后缀 。

        例如: c:\code\test.txt 为了方便起见,文件标识常被称为文件名。

        说到文件名,就要讲一讲文件的位置问题。

3.文件路径

绝对路径
        定义:文件真实存在的完整的、固定的路径,以硬盘(系统)根目录为起点,经过一级级文件指向文件,必须准确,灵活性较差,迁移性也较差。

相对路径
        定义:文件路径简单化的一个路径,以当前文件为起点,进行一级级文件指向被引用的文件。较为灵活,易于修改,迁移性强。

相对路径的文件指向:

…/ 表示当前文件所在的目录(文件夹)的上一级目录(文件夹)

./ 表示当前文件所在的目录(可省略不写)

/ 表示当前站点的根目录(域名映射的硬盘目录)


 如上图:

在文件A2去寻找A1文件,路径是:./A1
在文件夹B1去寻找A2文件,路径是:…/A/A2

A1的绝对路径是:根目录文件夹:\子文件夹A\文件夹A1

总结:

当有两个相同名字的文件时,它所处的路径位置就代表了各自文件的唯一标识。

文件路径没有规定的使用要求,应根据自己的实际情况来选择适合的文件路径表示方法。


二.文件的打开与关闭

        1.文件指针

        当我们要操作文件时,就需要执行三大步操作:1.打开文件,2.对文件进行读/写操作,3.关闭文件。这就像我们口渴了需要喝水一样,先拧开瓶口,将瓶中的水引向嘴里,喝完后需要盖上瓶盖,防止水漏掉,这是一个道理。

        其实文件是由一个结构体组成,结构体中包含了文件的名称、文件的大小、文件的类型以及文件的路径位置等。

 如上图所示,红色矩形框住的就好比是文件信息区一样。

        当我们打开文件时,文件就会在内存空间中产生一个文件信息区,里面就是上面所说的结构体,文件信息区与文件紧密的绑定在一起,文件信息区的类型是FILE*。

        而在VS编译系统中,FILE文件类型在库<stdio.h>的表现形式如下:

struct _iobuf {      

                   char *_ptr;

                   int   _cnt;

                  char *_base;  

                   int   _flag;    

                   int   _file;    

                   int   _charbuf;    

                   int   _bufsiz;    

                  char *_tmpfname;  

                    }; typedef struct _iobuf FILE; 

        注:不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

         每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便,如下:

FILE* pf;

我们可以称它为文件指针变量

      使用文件指针的原因在于:每一个文件信息区在被打开时都会返回一个地址,而地址就需要用指针去接收。  每一个FILE*的文件指针都会指向相应文件信息区的地址,以便我们能够通过指针所指向的地址去访问或维护文件。


        2.打开与关闭函数 

ANSIC 规定使用:        fopen函数来打开文件,

        FILE * fopen ( const char * filename, const char * mode ); 

                                              fclose关闭文件。

                                int fclose ( FILE * stream );

        这就和之前所讲的动态内存分配是一个道理,手动malloc(开辟)了堆区的内存空间,就需要主动去free(释放)空间,否则会造成内存泄漏。

        

3.打开和关闭的使用

        如上图:在test.c往文件中写数据被称为是写操作,即往外输出数据。

                       从文件中读取数据放入到test.c中读取数据被称为是读操作,即往内输入数据 

当我们打开函数时用到了fopen函数,先来介绍一下这个函数的参数

        FILE * fopen ( const char * filename, const char * mode ); 

        char* filename:是一个字符型指针,表示文件的名称,里面需要填写文件的路径地址(可以是相对路径,也可以是绝对路径)。

        char* mode:也是一个字符指针,表示文件的打开模式。这个参数决定了之后对文件的执行方向,文件的打开模式不同,所产生的作用就不一样。

        

 下面来看一看第二个参数的使用选择:

        注:通过上表的详细说明,我们可以选择自己想要用到的读/写模式。 

 4.代码实践:

int main() {
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}

    //写数据到文件的执行操作
    //....................

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

r 打开只读文件,该文件必须存在。 
r+ 打开可读写的文件,该文件必须存在。 
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。 
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 

 

原网站

版权声明
本文为[云逸943]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_69283129/article/details/126159191