【C语言进阶】文件数据操作详解(万字教你真正理解文件使用)

文件操作

目录

​​​​​​一、我们为什么需要文件?

二、究竟什么才是文件

程序文件

数据文件

三、文件名

四、文件类型

五、文件缓冲区

六、文件指针

七、打开文件和关闭文件

fopen

fclose

八、文件顺序读写表

流(stream)

fputc

fgetc

         fgets

fputs

fprintf

fscanf

对比一组函数

fwrite

fread

九、文件随机读写

fseek

ftell

rewind

十、文件读取结束的判定


一、我们为什么需要文件?

        由于我们之前所编写的程序在执行过程中所产生的数据及结果都只是临时存放在内存区域,一旦程序运行结束后,该程序所开辟的内存空间将全部返回给操作系统。那么此时我们再想要去查看之前的数据和执行结果,显示是不可能的。

那该如何解决这个问题呢? 

我们需要用到的就是——文件。 没错,文件 的作用就是可以将程序运行过程中所产生的数据结果都存储下来,即便程序结束运行,我们依然可以通过 文件 来找到这些数据,甚至再次运行程序时依然能使用这些数据。

二、究竟什么才是文件

准确的来说:计算机文件就是存储在计算机硬盘、磁盘上的信息集合。例如熟悉的图片文件、视频文件、程序等等。

文件有各种各样的类型,但是在程序设计中,我们一般谈的文件有两种:程序文件数据文件

程序文件

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


数据文件

文件的内容不是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

这次我们便围绕数据文件进行讨论说明。

三、文件名

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

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

当然为了方便起见,文件标识常被成为 文件名。文件名主干 的命名规则遵循标识符的命名规则。

但是我们要了解此时所称呼的文件名,实际上包括以上3部分内容,而不仅仅是文件名主干。

这边我来举例一些常见的文件后缀方便大家去了解文件的性质:

txt(文本文件)dat(数据文件)doc(Word生成的文件)xlsx(excel生成的文件)exe(可执行文件)jpg(图片文件)等……

四、文件类型

那么我们如何来区分文件类型呢?

首先根据数据的组织形式,数据文件被称为了 文本文件二进制文件

而数据在内存中以二进制的形式存储时,如果不加转换的输出到外存中去,那么就是 二进制文件

反之,如果在外存上以ASCII码的形式进行存储,如果在存储到外存前就转换,那么就是 文本文件


一个数据如何在内存中存储的?

字符在内存中一律是以ASCII码值形式进行存储的,而数值型数据既可以用ASCII码值形式存储,也可以使用二进制形式进行存储。

 例:

#include <stdio.h>
int main()
{
    int a = 10000;
    FILE *pf = fopen("eg.txt", "wb");
    //fopen 打开名为test.txt的文件 
    //wb 以二进制的形式写入文件
    fwrite(&a, 4, 1, pf);//写一个四个字节的数据放到以pf维护的文件中去
    fclose(pf);
    pf = NULL;
    return 0;
}

我们以二进制编辑器打开我们所创建的 eg.txt 文件中去:

我们可以看出这是以16进制形式显示的,并且由于编译器是按照小端进行存储的。

所以应该为 00 00 27 10

转换成二进制就是 00000000 00000000 00100111 00010000

图解:

五、文件缓冲区

我们来了解一下什么是文件缓冲区:

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

图解:

六、文件指针

缓冲文件系统中, 关键的概念是 “文件类型指针” , 简称 “文件指针” 。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。
该结构体类型是由系统声明的,取名为 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 指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件

图解:

七、打开文件和关闭文件

我们都知道,文件在读写之前应该想先打开文件,在使用结束后应该关闭文件

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


fopen

//函数原型
FILE* fopen(const char* filename, const char* mode);

函数功能: Open a file.(打开文件

  • 57
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 53
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HyDraZya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值