前言
 
很多非计科的专业并未对文件操作这点做出详细解释,今天复习到这里就想趁此机会记录一下自己学到的知识,也希望能对大家有所帮助。
 
一.为什么使用文件
 
 如果没有⽂件,我们写的程序的数据是存储在电脑的 内存中, 如果程序退出,内存回收,数据就 丢失了 ,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤  
 
 ⽂件。 
 
二.什么是文件
 
 磁盘上的⽂件是⽂件。  
 
 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类  
 
 的)。  
 
👻2.1 程序⽂件 
 
 程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows  
 
 环境后缀为.exe)。  
 
👻2.2 数据⽂件 
 
 ⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。 
 
我们本次讨论的是数据文件
 
对程序文件感兴趣的可以去了解一下编译和链接
 
👻2.3 ⽂件名 
 
 ⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。  
 
 ⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀  
 
 例如:  c:\code\test.txt  
 
 为了⽅便起⻅,⽂件标识常被称为⽂件名。 
 
 这里的文件名我们可以用 相对路径来写,也可以用绝对路径 
 
三.文本文件和二进制文件
 
 根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。  
 
 数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。  
 
 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂ 本⽂件。  
 
 ⼀个数据在内存中是怎么存储的呢?  
 
 字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。  
 
 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节即将它看作是字符‘1,’0‘,’0‘,’0‘,’0‘(每个字符⼀个字节),若是以二进制输出到磁盘⽽则在磁盘上只占4个字节,因为他被看作一个整型(VS2019测试)。 
 
四.⽂件的打开和关闭 
 
 🍓4.1 流和标准流 
 🍌 4.1.1 流 
  我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。  
  我们把数据放到流里,流再把数据运送到需要的位置。 
  ⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。 
  🍌 4.1.2 标准流 
  那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?  
  那是因为C语⾔程序在启动的时候,默认打开了3个流:  
  •  stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。  
  •  stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出  
  流中。  
  •  stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。  
  这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。  
  stdin、stdout、stderr 三个流的类型是:  FILE*  ,通常称为⽂件指针。  
  C语⾔中,就是通过  FILE*  的⽂件指针来维护流的各种操作的。  
  🍓4.2 ⽂件指针 
  缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。  
  每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE.  
  这是vs2022下的FILE 的定义 
      
  
  不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。  
  每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信  
  息,使⽤者不必关⼼细节。  
  ⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。  
  下⾯我们可以创建⼀个FILE*的指针变量: 
   FILE*p; 
 
 
  
  定义p是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变  
  量)。通过该⽂件信息区中的信息就 能够访问该⽂件 。 
  🍓4.3 ⽂件的打开和关闭 
  ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。  
  在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。  
  ANSIC 规定使⽤  fopen  函数来打开⽂件,  fclose  来关闭⽂件。 
  //打开文件 
  FILE *  fopen  (  const char  * filename,  const char  * mode );  
  //关闭文件 
  int  fclose  ( FILE * stream ); 
 
   
  
 mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式: 
 
  打开方式        说明
 r             以只读方式打开文件,该文件必须存在。
 r+            以读/写方式打开文件,该文件必须存在。
 rb+            以读/写方式打开一个二进制文件,只允许读/写数据。
 rt+            以读/写方式打开一个文本文件,允许读和写。
 w            打开只写文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。
 w+            打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
 a            以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。
 a+            以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。
 wb            以只写方式打开或新建一个二进制文件,只允许写数据。
 wb+            以读/写方式打开或建立一个二进制文件,允许读和写。
 wt+            以读/写方式打开或建立一个文本文件,允许读写。
 at+            以读/写方式打开一个文本文件,允许读或在文本末追加数据。
 ab+            以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
    
 
五.⽂件缓冲区 
 
  ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为  
  程序中 每⼀个 正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓  
  冲区, 装满缓冲区后才⼀起送到磁盘上。 如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输入到内存缓冲区,充满缓冲区后再从缓冲区 逐个地 将数据送到程序数据区(程序变量等)。缓 冲区的⼤⼩根据C编译系统决定的 
  fclose可以刷新文件缓冲区。 
 总结
  ok,今天的分享就到这里了,希望我的博客可以给你带来帮助。