【c语⾔】⽂件知识点总结
⼀. 什么是⽂件
1. ⽂件基本概念
⼴义上磁盘上的⽂件都是⽂件。但在程序设计中我们把⽂件分为两类:程序⽂件、数据⽂件。
程序⽂件:包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
数据⽂件:⽂件的内容不⼀定是程序,还可能是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。下⾯我们讨论的是数据⽂件。
2. ⽂件标识
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤户识别和引⽤。其中⽂件标识包括三个部分:⽂件路径 + ⽂件名 + ⽂件后缀。
3. ⽂件类型
根据数据的组织形式,数据⽂件⼜分为为⽂本⽂件和⼆进制⽂件。
⽂本⽂件:如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
⼆进制⽂件:数据在内存中以⼆进制的形式存储,如果不加转换地输出到外存,默认就是⼆进制⽂件。
规定:字符⼀律按ASCII码形式存储,数值型数据既可以⽤ASCII码形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节(⼀个整型数据占4个字节)。
4. ⽂件控制块
为了描述⼀个⽂件相关的信息,每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件控制块,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及
⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是有由系统声明的,取名FILE。
不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。每当打开⼀个⽂件的时候,操作系统会根据⽂件的情况⾃动为该⽂件创建⼀个FILE类型的结构体变量,并填充其中的信息,使⽤者不必关⼼具体的实现细节
C将⽂件的内容存储到顺序字节流⾥,其实就是⼀块缓冲区,这个字节流以⽂件结束符EOF(end of file)作为结束标志。在⽂件控制块中有⼀个指针 _ptr 指向这个字节流的起始位置,相当于数组名;还有⼀个位置指⽰器 _charbuf 标识字节流当前的位置,相当于数组的下标。
⼆. ⽂件操作的函数
前⾯已经介绍了⽂件相关的基本知识和概念。那么在语⾔层⾯上(⽐如C语⾔),如何对⼀个⽂件进⾏打开、关闭、读写数据的操作呢?C 语⾔提供了⼀系列⽂件操作相关的库函数,包含在头⽂件stdio.h⾥。
1. ⽂件的打开与关闭
1.1 ⽂件打开函数 — fopen
FILE*fopen(const char* filename,const char* mode );
参数介绍:
filename:如果我们要打开的⽂件与我们当前正在运⾏的源代码在同级⽬录下,那么可直接写⽂件名字。不在同级⽬录下的话需要写明⽂件所在的路径(绝对路径或相对路径都可以)。
mode:⽂件打开⽅式,常⽤的包括以下⼏种。
打开⽅式含义
“r”read:打开⽂件进⾏输⼊操作。该⽂件必须存在。
“w”write:为输出操作创建⼀个空⽂件。如果已存在同名⽂件,则丢弃其内容,并将该⽂件视为新的空⽂件。
“rb”read:以⼆进制形式打开⽂件,进⾏输⼊操作。该⽂件必须存在。
“wb”write:以⼆进制形式打开⽂件,为输出操作创建⼀个空⽂件。如果已存在同名⽂件,则丢弃其内容,并将该⽂件视为新的空⽂件。
功能:以特定的⽅式打开⽂件。操作系统会根据第⼀个参数的路径到或创建该⽂件,并新建⼀个存储该⽂件信息的⽂件控制块,最后返回⽂件控制块的地址。注意:⽂件刚打开时,位置指⽰器指向最开始位置。
返回值:
打开成功:返回该⽂件的⽂件控制块的地址。
打开失败:返回空指针,即NULL。
函数使⽤举例
在当前路径下创建⼀个新⽂件,因为事先不存在这个⽂件,所以我们采⽤"w"模式打开。
// 1、打开⽂件
FILE* pf =fopen("","w");
if(pf ==NULL)
{
printf("open error\n");
return1;
}
// 2、对⽂件进⾏⼀系列操作...
/
write的返回值/ 3、关闭⽂件
return0;
运⾏结果:
1.2 ⽂件关闭函数 — fclose
就像malloc动态开辟空间,使⽤完毕之后需要⼿动free释放掉这块空间⼀样的道理。我们通过fopen函数打开⼀个⽂件,操作系统为我们动态创建了这个⽂件的⽂件控制块,不使⽤的话需要fclose函数来释
放它。注意并不是删除该⽂件,这个⽂件依然没有改变,只是删除fopen 函数创建的存储该⽂件信息的⽂件控制块。
函数原型
int fclose( FILE* stream );
参数:⽂件控制块的地址。
功能:释放开辟的⽂件控制块的空间。形象说就是关闭⼀个⽂件。
返回值:关闭成功返回0,失败返回EOF。
1.3 ⽂件操作的⼤致流程
#include<stdio.h>
int main()
{
// 1、打开⽂件
FILE* pf =fopen("","w");
if(pf ==NULL)
{
printf("open error\n");
return1;
}
// 2、对⽂件进⾏⼀系列操作
// .......
/
/ 3、关闭⽂件
fclose(pf);
pf =NULL;
return0;
}
2. ⽂件的顺序读写
在上⾯,我们介绍了最基本的打开、关闭⽂件,其本质是创建、释放⽂件控制块。当然这只是开始,最重要的是我们拿到⽂件控制块后,如何通过它来完成⽂件的读写操作。
对⽂件数据的读写可以分为顺序读写和随机读写。顺序读写,即挨着顺序逐个字符的对⽂件中的数据进⾏写⼊和读取。下⾯我们介绍C语⾔中对⽂件进⾏顺序读写的⼀系列函数。
2.1 字符的写⼊和读取函数 — fputc 和 fgetc
⼀、fputc
int fputc(int character, FILE* stream );
参数
character:被写⼊的字符。
stream:⽂件控制块的地址。
功能:字符被写⼊字节流的位置指⽰器所指⽰的位置,然后该指⽰器将⾃动前进1。
返回值:写⼊成功返回这个被写⼊的字符。如果写⼊错误,则返回EOF并设置错误指⽰符(ferror)。
函数使⽤举例
在当前⽬录不下创建⼀个新的⽂件,写⼊⼩写字母序列a~z。
void Testfputc()
{
/
/ 1、打开⽂件
FILE* pf =fopen("","w");
// 2、使⽤fputc对⽂件进⾏字符的写⼊
int i =0;
for(i ='a'; i <='z';++i)
{
fputc(i, pf);
}
// 3、关闭⽂件
fclose(pf);
pf =NULL;
}
最终当前⽬录下⽣产⼀个⽂件。
⼆、fgetc
int fgetc( FILE* stream );
参数:⽂件控制块地址。
功能:返回指定⽂件控制块的内部位置指⽰器当前指向的字符。然后将⽂件位置指⽰器+1。
返回值:
成功的话返回提取到的字符。
如果调⽤时字节流位于⽂件结束位置,则该函数返回EOF并设置⽂件结束指⽰符(feof)。如果发⽣其他读取错误,该函数也返回EOF,但设置其错误指⽰符(ferror)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论