C语言:文件操作

一、 为什么使⽤⽂件?

        文件是我们存放数据的地方,如果没有文件,我们写的程序会存在内存中,如果程序退出,空间就会被回收,我们的数据就会消失,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。

二、 ⽂件

     1 程序⽂件

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

      2 数据⽂件

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

      3 ⽂件名

        ⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。 ⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
        例如: c:\code\test.txt
 

三、⼆进制⽂件和⽂本⽂件

         根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
 
⼆进制⽂件:数据在内存中以⼆进制的形式存储, 如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
 
⽂本⽂件:如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。 以ASCII字符的形式存储
 

四、⽂件的打开和关闭

     1.流和标准流

       1.1 流

        我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
 

      1.2 标准流

我们的C语⾔程序在启动的时候,默认打开了3个流:
 
• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
 
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。
 
• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
 
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为⽂件指针。C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。
 

      2 ⽂件指针

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

FILE* Fp;//⽂件指针变量,这是创建的一个文件指针

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说, 通过⽂件指针变量能够间接找到与 它关联的⽂件。
   像是:
80f1c6de06f345cdace708cd0b50ec07.png
 

      3 ⽂件的打开和关闭

        ⽂件在读写之前应该 先打开⽂件,在使⽤ 结束后关闭⽂件。在编写程序的时候,在打开⽂件的同时,都会返回⼀个 FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
        ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。
// 打开⽂件
FILE * fopen ( const char * filename, const char * mode );
 
// 关闭⽂件
int fclose ( FILE * stream );
mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
 
  r:以只读的方式打开文本文件,文件必须存在;

 

  w:以只写的方式打开文本文件,文件若存在则清空文件内容从文件头部开始写,若不存在则根据文件名创建新文件并只写打开;

  a:以只写的方式打开文本文件,文件若存在则从文件尾部追加,文件原来存在的内容不会清除(除了文件尾标志EOF),若不存在则根据文件名创建新文件并只写打开;

  r+:以可读写的方式打开文本文件,文件必须存在;

  w+:以可读写的方式打开文本文件,其他与w一样;

  a+:以可读写的方式打开文本文件,其他与a一样;

若打开二进制文件,可在后面加个b注明,其他一样,如rb,r+b(或rb+)

/* fopen fclose example */

#include <stdio.h>
int main ()
{
 FILE * pFile;

 //打开⽂件
 pFile = fopen ("myfile.txt","w");

 //⽂件操作
 if (pFile!=NULL)
 {
 fputs ("fopen example",pFile);

 //关闭⽂件
 fclose (pFile);

 }

 return 0;
}

五、⽂件的顺序读写函数

在C语言中,可以使用以下函数进行顺序读写操作:

1. `fopen`:用于打开文件,返回文件指针

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

 

2. `fclose`:用于关闭文件

int fclose(FILE *stream);

3. `fgetc`:用于从文件中读取一个字符

   int fgetc(FILE *stream);

4. `fputc`:用于向文件中写入一个字

   int fputc(int c, FILE *stream);

5. `fgets`:用于从文件中读取一行字符串

   char *fgets(char *s, int size, FILE *stream);

6. `fputs`:用于向文件中写入一个字符串

   int fputs(const char *s, FILE *stream);

7. `fprintf`:用于向文件中格式化输出数据

   int fprintf(FILE *stream, const char *format, ...);

8. `fscanf`:用于从文件中格式化读取数据

   int fscanf(FILE *stream, const char *format, ...);

这些函数可以帮助你进行顺序读写操作,从文件中读取数据或向文件中写入数据。

 

六、 ⽂件的随机读写

     1 fseek

        根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。
 
   int fseek ( FILE * stream, long int offset, int origin );
4af1222851484f27a2db4af4b5f03e8c.png
 
关于其中的 SEEK_SET  ,其实还有 SEEK_END 和 SEEK_CUR
其中 SEEK_END 表示文件末尾;SEEK_CUR  表示文件当前位置
 
54c62b70b2ab4b1eb03ba078f06dbb48.png
 
这三条语句是等价的,效果一样
 
!注意:每条语句之前没有对文件进行操作,效果才一样,操作的话会使光标移动,上述1和3一样,但2不是,SEEK_CUR  是表示当前位置,操作之后会变的。
 

     2 ftell

        返回⽂件指针 相对于起始位置的偏移量
 
   long int ftell ( FILE * stream );
8d7208ba14784ef19e7521d5dc22b750.png
 
这是文件"myfile.txt"
 
40d0ac7291474f8280b1af967f33a914.png
 
可以发现,偏移量12正好是文件字符数目
 
de18be87e70546df8125be6c0e7f3103.png
 
所以我们可以使用这种方法来获取文件的字符数
 
3da456f364b1473d926065213ebdf2fd.png
 

      3 rewind

        让⽂件指针的位置回到⽂件的起始位置
 
   void rewind ( FILE * stream );
dbe6849b45764a5780650355b807fdd5.png
 
 

七、⽂件读取结束的判定

     1 被错误使⽤的 feof

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

        读取文件会标记  读到末尾 或 读取错误  根据这个可以知道文件读取结束是什么原因导致的

读到末尾:  feof     是的话返回非0,否则0

读取错误 : ferror  是的话返回非0,否则0

858811d9414d43f6b53f72d0dfc59b23.png

补充:

•   feof     判断是否为 EOF 
 
•   ferror  判断返回值是否为 NULL 

八、 ⽂件缓冲区

        ANSIC 标准采⽤“ 缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“ ⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。
 
假设一个场景:同学A每分钟问同学B一个问题,虽然同学A解决了问题,但是同学B几乎做不了自己的事。装满缓冲区再⼀起送到磁盘就可以让硬盘能够处理其他操作,提高效率
 

756ac0e0cdfd4be3b37b56b90d674ef4.png!注意:

        为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件

 

        关于文件操作的内容就介绍到这里,觉得还不错的就点个赞和关注吧~~~

2da4d58da6904f27be3a807cf2789eef.png

        谢谢!

 

 

 

 

  • 33
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值