概述
1.一个C文件是一个字节流或二进制流,它把数据看作是一连串的字符(字节),而不考虑记录的界限。在C语言中对文件的存取是以字符(字节)为单位的。
(注:流式文件 —— 输出时不会自动增加回车换行符以作为记录结束的标志,输入时不以回车换行符作为记录的间隔)
2.ANSI C标准使用缓冲文件系统处理文本文件和二进制文件。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个结构体变量中的,该结构体类型是由系统定义的,取名为 FILE
。
打开和关闭文件
读写之前打开文件,使用完毕后关闭文件
fopen函数
1.函数原型:FILE *fopen(const char *filename,const char *mode)
2.调用方式:
FILE *fp;
fp=fopen(文件名,打开方式);
3.若打开成功:返回一个指向FILE类型结构体变量的指针
若打开出错:返回一个空指针值NULL(NULL在stdio.h文件中被定义为0)
建议用以下方法打开一个文件:
FILE *fp;
if((fp=fopen("myFile","mode"))==NULL)
{
printf("Open Error");
}
4.fopen函数原型中的mode是打开文件的方式,具体如下表:
5.向计算机输入文本文件时,计算机将回车换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。而在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件的数据形式完全一致。
6.在程序开始运行时,系统自动打开三个标准文件:标准输入、标准输出、标准出错输出。通常这三个文件始终与终端相连,因此我们所用到的从终端输入或输出都不需要打开终端文件。系统自动定义了3个指针文件:stdin,stdout,stderr,分别指向终端输入、终端输出、标准出错输出(从终端输出)。如果程序指定要从stdin所指的文件输入数据,就是指从终端键盘输入数据。
fclose函数
1.函数原型:int fclose(FILE *fp)
2.调用形式:
fclose(fp);
2.若执行了关闭操作则返回0,否则返回EOF(-1)。【注】EOF不是可输出字符
读写文件
fread函数和fwrite函数
作用:fread和fwrite函数一般用于二进制文件的输入输出,因为它们是按照数据块的长度来处理输入输出的,在字符发生转换的情况下结果可能会与设想的有偏差。
1.函数原型:
size_t __cdecl fread(void * __restrict__ _DstBuf,size_t _ElementSize,size_t _Count,FILE * __restrict__ _File);
size_t __cdecl fwrite(const void * __restrict__ _Str,size_t _Size,size_t _Count,FILE * __restrict__ _File);
2.调用形式:
fread(文件中的数据被读出后的存放地址,读出一项的字节数,读出几项,文件指针);
fwrite(将要写入文件的数据的存放地址,写入一项占的字节数,写入几项,文件指针);
3.若fread或fwrite调用成功,则函数返回值为读出或写入的项数
例子:
FILE *fp_w,*fp_r;
int s[size]={0};
if((fp_w=fopen("myFile","wb"))==NULL) //利用返回值判断是否成功执行
{
printf("OPEN ERROR");
}
for(int i=0;i<size;i++)
{
if(fwrite(&s[i],sizeof(int),1,fp)!=1) //利用返回值判断是否成功执行
{
printf("WRITE ERROR");
}
}
fclose(fp_w);
if((fp_r=fopen("myFile","rb"))==NULL)
{
printf("OPEN ERROR");
}
for(int i=0;i<size;i++)
{
if(fread(&s[i],sizeof(int),1,fp)!=1)
{
printf("READ ERROR");
}
}
fclose(fp_r);
fprintf函数和fscanf函数
作用:fprintf函数和fscanf函数是格式化读写函数,和printf,scanf作用相仿,只是前者读写对象是磁盘文件,后者是终端。
1.函数原型:
int __cdecl fscanf(FILE * __restrict__ _File,const char * __restrict__ _Format,...);
int __cdecl fprintf(FILE * __restrict__ _File,const char * __restrict__ _Format,...);
2.调用形式:
fscanf(文件指针,格式字符串,输入列表); //从文件按格式读出
按照规定格式将磁盘文件上的数据送给输入列表中对应的变量。
fprintf(文件指针,格式字符串,输出列表); //按格式写入文件
将输出列表中变量的值按照格式字符串规定的格式输出到fp指向的文件上。
3.fscanf若正常执行,返回的是从文件实际读取的变量个数,出错或者到结尾返回EOF。
fprintf若正常执行,会返回写入文件的字节数,否则返回负数 。
【注】在磁盘与内存频繁交换数据的情况下,尽量不使用fprintf和fscanf.
fgets函数和fputs函数
作用:fgets用于从指定文件读入一个字符串,fputs用于向指定文件输出一个字符串
fgets(str,n,fp);//从fp指向的文件输入n-1个字符,然后在最后加一个'\0'字符,然后后存至字符数组str,最后返回str首地址
futs(str,fp);//将字符串输出到fp指向的文件,输出成功返回0,失败返回EOF
fputc函数和fgetc函数
作用:fputc函数用于把一个字符写到磁盘文件,fgetc函数用于从指定文件读入一个字符
fputc(ch,fp);//若输出成功,返回ch,否则返回EOF(-1)
ch=fgetc(fp);//若遇到文件结束符,返回EOF