第十六章 文件
16.1 C语言文件的概念
文件,记录在外部介质的数据集合。
C语言中,对于输入,输出的数据按“数据流”的形式处理。
C语言中,输入,输出文件都以数据流的形式存储在介质上。
存取方式,顺序存取和直接存取。
顺序存取,读或写的操作,总是从文件的开头开始,顺序读写。
16.2 文件指针文件指针,指向一个结构体类型的指针变量,
形式,FILE *指针变量名 ;
如,FILE *fp1,*fp2; /* fp1,fp2 称为文件指针 */
直接存取,又名随机存取,首先读写字节号,然后直接对此位置上的数据进行操作,
对文件的输入或输出的操作实际上对缓冲区的操作
对文件进行操作前,必须打开文件,使得读写文件与实际的数据联系起来,可用库函数 fopen.
调用形式,fopen(文件名,文件使用方式 );
函数返回一个指向 FILE类型的指针
如,FILE *fp;
fp=fopen(“file_a”,”r”);
调用之后,fp指向了文件 file_a.
16.3 打开文件无论用何种方式打开,若打开文件出现了错误,fopen函数将返回 NULL,为了正确打开文件,建议用以下的程序段,
if((fp=fopen(“file_a”,”r”))= =NULL)
{printf(“cannot open this file!\n);
exit(0);
}
常用的文件打开文件方式,
“r”,“rb”
“w”,”wb”
“a”,”ab”
“r+”,”rb”
“w”,”wb+”
“a+”,”ab+”
注,当运行一个 C程序时,系统会自动打开文件文件指针为,stdin,stdout,stderr,并在 stdio.h
头文件中进行了说明
16.4 关闭文件当对文件的读写操作后,必须关闭它调用形式,fclose(文件指针 )
返回成功,函数返回 0,否则返回非 0.
16.5 调用 getc(fgetc)和 putc(fputc)函数进行输入和输出当打开文件后,我们可以对文件进行输入和输出,可调用如下函数
1.调用 putc(或 fputc)函数输出一个字符调用形式,putc(ch,fp);
功能,将字符 ch写到文件指针为 fp所指的文件中去输出成功,函数返回所输出的字符,否则返回 EOF值,
注,fputc函数的调用形式和功能与之完全相同,
例 16.1 把从键盘输入的文本按原样输出 到名为
file_a.dat文件中去,用字符 @作为结束标志,
#include,stdio.h”
main()
{ FILE *fpout;
char ch;
if((fpout=fopen(“file_a.dat,”w”))==NULL)
{printf(“can?t open this file!\n);exit(0);}
ch=getchar();
while(ch!=?@?)
{fputc(ch,fpout); ch=getchar();}
fclose(fpout);
}
2,调用 getc(或 fgetc)函数输入一个字符调用形式,ch=getc(pf);
功能:从 pf指定的文件中读入的一个字符赋给变量 ch
例 16.2 把一个已存在磁盘上的 file_a.dat文本文件的内容,
输出到屏幕上。
#include,stdio.h”
main()
{ FILE *fpin;
char ch;
if((fpin=fopen(“file_a.dat,”r”))==NULL)
{printf(“can?t open this file!\n);exit(0) }
ch=fgetc (fpin);
while(ch!=EOF)
{ putchar(ch); ch=fgetc(fpin);}
fclose(fpin);
}
16.6 判文件结束函数 feof
当数据以二进制形式存放到期文件中去,不能采用
EOF作为结束标志,我们用 feof函数来判断文件是否结束如果遇到文件结束,函数 feof( fp)的值为 1,否则为
0
说明:此函数既可以判断二进制文件,也可以用来判断文本文件。
见书 p221的例 16.3
16.7 fscanf函数和 fprintf函数
1.fscanf函数功能,从磁盘上的文本文件中按格式输入,与 scanf函数相似形式,fscanf(文件指针,格式控制字符串,输入表项 )
如,fscanf(fp,”%d%d”,&a.&b); 其中 fp已指向一个已打开的文本文件,
注,fscanf(stdin,”%d%d”,&a,&b);
与 scanf(”%d%d”,&a,&b); 完全等价
2.fprintf函数功能,按格式将内存中的数据转换成对应的字符,并以 ASCII
代码输出 到文本中形式,fprintf(“文件指针,格式控制字符串,输出表项 )
如,fprint(fp,”%d %d”,x,y); 其中 fp已指向一个已打开的文本文件,它是把二个整数按 %d格式输出到 fp所指的文件中,
注,fprint(stdout,”%d %d”,x,y); 等价于
print(”%d %d”,x,y);
1,fgets函数调用形式,fgets(str,n,fp);
功能:从文件中读入字符串其中,str是存放字符串的起始地址; n是一个 int类型变量。
16.7 fgets函数和 fputs函数功能:从文件中读入字符串,具体是从 fp所指的文件中读入
n-1个字符放 str为起始的地址内干。若在未读满 n-1个字符之时,已读到一个换行符或 EOF,则结束本操作。
注:此函数最多只能读入 n-1个字符,并自动加上‘’ \0‘ 。
2,fputs 函数调用形式,fputs(str,fp);
功能:把字符串输入到文件中去输出成功:函数返回非 0,否则为 0。
16.9 fread函数和 fwrite函数
fread和 fwrite函数用来读写二进制文件调用形式,fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中:
buffer是数据块的指针,对 fread,它是一个内存块的首地址,数据存入这个内存中;对 fwrite,它是要输出的数据块的起始地址。
size是每个数据块的字节数
count是每读写数据块的个数,fp是文件指针
16.10 文件定位函数
1.文件位置指针,与文件指针是完全不同的概念,它是表示当前读或写的数据在文件中的位置,
当打开一个文件时,文件位置指针指向文件的开头当文件位置指针指向文件的结尾时,表示文件结束,
2.fseek函数功能,移动文件指针到指定的位置上,读或写的操作从此位置开始,
形式,fseek(pf,offset,origin)
其中,offset是以字节为单位的位移量,为长整型数,origin
是起始点,可用标识符或数字来代表,见书 p225
如,fseek(pf,30l,SEEK_SET) 使文件位置指针从文件头后移 30字节
3.ftell函数功能,获得文件位置指针的位置,函数的返回形式是给出当前位置指针相对鹫地文件开头的字节数,
调用形式,long t;
t=ftell(fp);
若要求出一个文件的长度,可通过以下函数求出文件的字节数,
fseek(fp,0L,SEEK_END);
t=ftell(fp);
4.rewind函数 (又名反绕函数 )
形式,rewind(pf);
功能,使文件的位置指针回到文件的开头,
16.1 C语言文件的概念
文件,记录在外部介质的数据集合。
C语言中,对于输入,输出的数据按“数据流”的形式处理。
C语言中,输入,输出文件都以数据流的形式存储在介质上。
存取方式,顺序存取和直接存取。
顺序存取,读或写的操作,总是从文件的开头开始,顺序读写。
16.2 文件指针文件指针,指向一个结构体类型的指针变量,
形式,FILE *指针变量名 ;
如,FILE *fp1,*fp2; /* fp1,fp2 称为文件指针 */
直接存取,又名随机存取,首先读写字节号,然后直接对此位置上的数据进行操作,
对文件的输入或输出的操作实际上对缓冲区的操作
对文件进行操作前,必须打开文件,使得读写文件与实际的数据联系起来,可用库函数 fopen.
调用形式,fopen(文件名,文件使用方式 );
函数返回一个指向 FILE类型的指针
如,FILE *fp;
fp=fopen(“file_a”,”r”);
调用之后,fp指向了文件 file_a.
16.3 打开文件无论用何种方式打开,若打开文件出现了错误,fopen函数将返回 NULL,为了正确打开文件,建议用以下的程序段,
if((fp=fopen(“file_a”,”r”))= =NULL)
{printf(“cannot open this file!\n);
exit(0);
}
常用的文件打开文件方式,
“r”,“rb”
“w”,”wb”
“a”,”ab”
“r+”,”rb”
“w”,”wb+”
“a+”,”ab+”
注,当运行一个 C程序时,系统会自动打开文件文件指针为,stdin,stdout,stderr,并在 stdio.h
头文件中进行了说明
16.4 关闭文件当对文件的读写操作后,必须关闭它调用形式,fclose(文件指针 )
返回成功,函数返回 0,否则返回非 0.
16.5 调用 getc(fgetc)和 putc(fputc)函数进行输入和输出当打开文件后,我们可以对文件进行输入和输出,可调用如下函数
1.调用 putc(或 fputc)函数输出一个字符调用形式,putc(ch,fp);
功能,将字符 ch写到文件指针为 fp所指的文件中去输出成功,函数返回所输出的字符,否则返回 EOF值,
注,fputc函数的调用形式和功能与之完全相同,
例 16.1 把从键盘输入的文本按原样输出 到名为
file_a.dat文件中去,用字符 @作为结束标志,
#include,stdio.h”
main()
{ FILE *fpout;
char ch;
if((fpout=fopen(“file_a.dat,”w”))==NULL)
{printf(“can?t open this file!\n);exit(0);}
ch=getchar();
while(ch!=?@?)
{fputc(ch,fpout); ch=getchar();}
fclose(fpout);
}
2,调用 getc(或 fgetc)函数输入一个字符调用形式,ch=getc(pf);
功能:从 pf指定的文件中读入的一个字符赋给变量 ch
例 16.2 把一个已存在磁盘上的 file_a.dat文本文件的内容,
输出到屏幕上。
#include,stdio.h”
main()
{ FILE *fpin;
char ch;
if((fpin=fopen(“file_a.dat,”r”))==NULL)
{printf(“can?t open this file!\n);exit(0) }
ch=fgetc (fpin);
while(ch!=EOF)
{ putchar(ch); ch=fgetc(fpin);}
fclose(fpin);
}
16.6 判文件结束函数 feof
当数据以二进制形式存放到期文件中去,不能采用
EOF作为结束标志,我们用 feof函数来判断文件是否结束如果遇到文件结束,函数 feof( fp)的值为 1,否则为
0
说明:此函数既可以判断二进制文件,也可以用来判断文本文件。
见书 p221的例 16.3
16.7 fscanf函数和 fprintf函数
1.fscanf函数功能,从磁盘上的文本文件中按格式输入,与 scanf函数相似形式,fscanf(文件指针,格式控制字符串,输入表项 )
如,fscanf(fp,”%d%d”,&a.&b); 其中 fp已指向一个已打开的文本文件,
注,fscanf(stdin,”%d%d”,&a,&b);
与 scanf(”%d%d”,&a,&b); 完全等价
2.fprintf函数功能,按格式将内存中的数据转换成对应的字符,并以 ASCII
代码输出 到文本中形式,fprintf(“文件指针,格式控制字符串,输出表项 )
如,fprint(fp,”%d %d”,x,y); 其中 fp已指向一个已打开的文本文件,它是把二个整数按 %d格式输出到 fp所指的文件中,
注,fprint(stdout,”%d %d”,x,y); 等价于
print(”%d %d”,x,y);
1,fgets函数调用形式,fgets(str,n,fp);
功能:从文件中读入字符串其中,str是存放字符串的起始地址; n是一个 int类型变量。
16.7 fgets函数和 fputs函数功能:从文件中读入字符串,具体是从 fp所指的文件中读入
n-1个字符放 str为起始的地址内干。若在未读满 n-1个字符之时,已读到一个换行符或 EOF,则结束本操作。
注:此函数最多只能读入 n-1个字符,并自动加上‘’ \0‘ 。
2,fputs 函数调用形式,fputs(str,fp);
功能:把字符串输入到文件中去输出成功:函数返回非 0,否则为 0。
16.9 fread函数和 fwrite函数
fread和 fwrite函数用来读写二进制文件调用形式,fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中:
buffer是数据块的指针,对 fread,它是一个内存块的首地址,数据存入这个内存中;对 fwrite,它是要输出的数据块的起始地址。
size是每个数据块的字节数
count是每读写数据块的个数,fp是文件指针
16.10 文件定位函数
1.文件位置指针,与文件指针是完全不同的概念,它是表示当前读或写的数据在文件中的位置,
当打开一个文件时,文件位置指针指向文件的开头当文件位置指针指向文件的结尾时,表示文件结束,
2.fseek函数功能,移动文件指针到指定的位置上,读或写的操作从此位置开始,
形式,fseek(pf,offset,origin)
其中,offset是以字节为单位的位移量,为长整型数,origin
是起始点,可用标识符或数字来代表,见书 p225
如,fseek(pf,30l,SEEK_SET) 使文件位置指针从文件头后移 30字节
3.ftell函数功能,获得文件位置指针的位置,函数的返回形式是给出当前位置指针相对鹫地文件开头的字节数,
调用形式,long t;
t=ftell(fp);
若要求出一个文件的长度,可通过以下函数求出文件的字节数,
fseek(fp,0L,SEEK_END);
t=ftell(fp);
4.rewind函数 (又名反绕函数 )
形式,rewind(pf);
功能,使文件的位置指针回到文件的开头,