今天和大家聊聊C语言中“文件”的应用
首先,我先来简述一下 C语言中.h文件和.c文件作用和区别
.h文件和.c文件作用
.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
.c文件一般放的是变量、数组、函数的具体定义
使用.h文件和.c文件的原因
使用.h文件和.c文件的原因主要是为了解决文件编译时重复声明即声明变更繁杂的问题
“在编译器只认识.c(.cpp))文件,而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地,人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件。但更为恐怖的是,当其中一个声明有变更时,就需要检查所有的.c(.cpp)文件。
于是人们将重复的部分提取出来,放在一个新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX这样的语句。这样即使某个声明发生了变更,也再不需要到处寻找与修改了。因为这个新文件,经常被放在.c(.cpp)文件的头部,所以就给它起名叫做“头文件”,扩展名是.h。
在我们语言的初学阶段,往往我们的程序只有一个.c的文件或很少的几个,这时我们就很少遇到头文件组织这个头疼的问题,随着我们程序的增加,代码量到了几千行甚至几万行,文件数也越来越多。这时这些文件的组织就成了一个问题,其实说白了这些文件的组织问题从理论上来说是软件工程中的模块设计等等的问题。”
要更深入理解这个问题我们需要对编译器原理有一定理解,编译器的作用是将程序代码转换成机器能够直接执行的机器码。主要有以下四个过程:
1.头文件的预编译,预处理
编译器在编译源代码时,会先编译头文件,保证每个头文件只被编译一次。
在预处理阶段,编译器将c文件中引用的头文件中的内容全部写到c文件中。
2.词法和语法分析(查错)
3.编译(汇编代码,.obj文件)
转化为汇编码,这种文件称为目标文件。后缀为.obj。
4.链接(二进制机器码,.exe文件)
将汇编代码转换为机器码,生成可执行文件。
在编译过程中,.h文件中的所有内容会被写到包含它的.c文件中,而所有的.c文件以一个共同的main函数作为可执行程序的入口。
在.h文件中编写函数实现依然可以正常编译执行,相当于所有.h的内容最后都被写到了main.c文件中。但是为了逻辑性、易于维护性以及一些其他目的,一般在.h文件中写函数的声明,在.c文件中编写函数的实现。
接下来进入正题:聊聊文件!
*文件:*存储在外部介质上数据的集合,是操作系统数据管理的单位
使用数据文件的目的:
1、数据文件的改动不引起程序的改动——程序与数据分离
2、不同程序可以访问同一数据文件中的数据——数据共享
3、能长期保存程序运行的中间数据或结果数据
文件分类:
按存储介质:
普通文件:存储介质文件(磁盘、磁带等)
设备文件:非存储介质(键盘、显示器、打印机等)
按数据的组织形式:
文本文件: ASCII文件,每个字节存放一个字符的ASCII码
二进制文件:数据按其在内存中的存储形式原样存放
文件类型指针:
文件结构体FILE——
缓冲文件系统为每个正使用的文件在内存开辟文件信息区
文件信息用系统定义的名为FILE的结构体描述
FILE定义在stdio.h中
文件相关的一些函数
f开关:fopen和fclose
读写:fputc和fgetc
判断文件是否结束:feof
读/写数据块:fread和fwrite
格式化I/O:fprint和fscanf
字符串:fgets和fputs
重置文件位置指针到文件开头:rewind
该百年文件位置的指针:fseek
返回位置指针当前位置:ftell
(PS:这些函数具体用法请亲们自己谷歌吧~~~这里就不详细说了~:) )