一、文件的作用与分类
程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,就需要使⽤⽂件。
文件分为数据文件和程序文件:
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
数据文件又分为文本文件和二进制文件
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
二、文件指针
FILE* pf;
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。
文件的打开和关闭
我们可以利用fopen,fclose和文件指针来进行文件的开关操作
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
其中mode代表文件的打开模式:
实例如下:
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开⽂件
pFile = fopen ("myfile.txt","w");
//⽂件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭⽂件
fclose (pFile);
}
return 0;
}
三、文件顺序读写函数介绍
(1)fgetc函数
int fgetc ( FILE * stream );
fgetc函数只有一个参数,指向标识输入流的文件对象的指针。当文件读取到末尾或者发生读取错误时,该函数返回EOF。该函数用于输入字符,适用于所有输入流。
(2)fputc函数
int fputc ( int character, FILE * stream );
该函数是字符输出函数,将字符输出到文件中,返回所写入的字符,如果发生错误,则返回EOF,适用于所有输出流。
(3)fgets函数
char * fgets ( char * str, int num, FILE * stream );
str指的是待输入的字符串,num代表复制到字符串中的字符的最大个数,该函数从文件中得到字符串复制到str中,成功则返回str的地址,失败则返回NULL,适用于所有输入流
(4)fputs函数
int fputs ( const char * str, FILE * stream );
str代表要输出到文件上的字符串,写入成功则返回非负数值,失败就返回EOF,适用于所有输出流。
(5)fscanf函数
int fscanf ( FILE * stream, const char * format, ... );
fscanf函数表示将文件流中的内容按照format的要求进行读取输入到所存放的地方,该函数返回成功读取的元素的个数,失败则返回EOF。适用于所有输入流。
(6)fprintf函数
int fprintf ( FILE * stream, const char * format, ... );
fprintf函数将后面的内容放到文件中去。适用于所有输出流。
(7)fread函数
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fread函数是二进制输入函数,只适用于文件。
ptr代表字符串,size表示所传元素的大小,count表示所传元素个数,stream是文件指针。
fread函数是用二进制的方式从文件中读取数据块放到数组中
(8)fwrite函数
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
fwrite函数是二进制输出函数,只适用于文件。
参数意义与fread函数的参数差不多,为了将数组中的元素以二进制的形式放在文件中。
四、文件随机读取函数
(1)fseek函数
fseek根据⽂件指针的位置和偏移量来定位⽂件指针。
int fseek ( FILE * stream, long int offset, int origin );
offset代表偏移量,origin代表起始位置,有三种情况:
1、文件的起始位置(SEEK_SET) 2、文件现在的位置(SEEK_CUR) 3、文件末尾(SEEK_END)
该函数是执行成功后,stream将指向以origin为基准,偏移offset个字节;执行失败则不改变stream指向的位置。
(2)ftell函数
long int ftell ( FILE * stream );
ftell函数返回文件指针相对于起始位置的偏移量。
(3)rewind函数
void rewind ( FILE * stream );
rewind函数是让文件指针返回文件的起始位置
五、文件结束的判定
在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。
feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF
fgets 判断返回值是否为 NULL .
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
例如:fread判断返回值是否⼩于实际要读的个数。