本次课内容:文件概念、文件打开与关闭、文件的顺序读写
教学目的:掌握相关文件概念,文件打开、关闭函数、指针操作定
义、顺序文件读写函数及应用。
重点:相关文件概念、文件操作函数、顺序文件操作。
难点:文件信息区、缓冲区、文件指针概念、定义及各函数应用。
预习,
字符和字符串操作函数
标准输入输出设备
一、文件概述
1、文件的概述
文件:记录在外部介质中的数据集合。
文件分类,
按介质:磁盘文件、磁带文件、光盘文件等。
按内容:源程序、目标文件、数据文件等。
按组织形式:字符代码文件、二进制文件等。
字符代码文件:每个字符占一个字节。
二进制文件:按内容中的存储形式存放。如整型点两字节。
2、标准( I/O)和系统( I/O)
C语言磁盘文件系统分两大类,
1) 缓冲文件系统(又称高层文件系统或标准文件系统)。
自动为文件设缓冲区。
2) 非缓冲文件系统(又称低层文件系统) 。
用户自己设置缓冲区。
缓冲区:提高数据读写速度在内容中设置的一块区域。
文件与缓冲区间关系见下页。
缓冲文件系统特点:对程序中的每一个文件都在内存中开辟一个
“缓冲区”。
读写文件数据的函数见表 9.1。
fgetc,fputc,fgets,fputs,fscanf,fprintf。
3、文件 (FILE)类型指针
FILE:是文件类型名,是一个由系统定义的结构体类型,各成员
为文件操作所需信息。
文件信息(区):读写位置、内存缓冲区地址、缓冲区未处理字符
数、文件操作方式等。
“文件信息区”在内存中是一个结构体变量。
对 FILE的定义是在 stdio.h头文件中由系统事先指定的。
只要程序用到一个文件,系统就为此文件开辟一个如上的结构体变
量。
a
程序数据区
输入 (出 )文
件缓冲区
磁盘文件
内存
定义指针变量,
如,FILE *fpt1,*fpt2,*fpt3;
FILE是文件类型指针,所定义的指针变量都是指向文件的。即指
向文件的信息区(文件信息区在内存中是一个结构体变量)。
定义格式,FILE * 文件结构体指针变量名表;
二、文件的打开与关闭
1、文件的打开
打开:在程序和操作系统之间建立联系。
格式,fopen (“文件名”,“文件使用方式” );
如,fopen (,file1”,”r”);
文件使用方式,r,只读,w:只写,a:追加
b,二进制文件 +,读写
r,w,a 可以与 b, + 结合,如 rb+。
文件 1的信息
区(结构体
变量)
文件 3的信息
区(结构体
变量)
文件 2的信息
区(结构体
变量)
fpt1 fpt2 fpt3
fopen函数返回值是一个地址(被打开文件的信息区)。
NULL:返回值为 0,即读时文件不存在,或写时磁盘满。
打开文件时,程序通知编译系统三个方面的信息,
1)要打开哪一个文件; 2)对文件的使用方式; 3)函数的返回值赋给
哪一个指针变量 。
文件打开方法,
if ((fp=fopen(“file1”,”r”))==NULL)
{ printf(“cannot open this file \n”);
exit(0);
}
exit(0):正常退出; exit(-1):出错退出(括号内非零)。
C程序 操作 系统 磁盘
文件名
文件使用
方式
指向文件
的指针
对磁盘文件,在使用前先要打开,而对 终端设备,也是作为文件 来
处理。
系统默认 的标准设备指针变量,
标准输入 stdin
标准输出 stdoit
标准出错输出 stderr
以上三个文件都是以终端设备为输入输出对象的。
如:指定输出一个数据到 stdout所指向的文件,就是指输出到终端
设备。
为使用方便,C程序中不必指定这三个文件,可以直接输入输出
处理,但指的都是标准的终端设备。
2、文件的关闭
格式,fclose(文件指针变量 );
功能:释放文件信息区(结构体变量)。
注:若此时缓冲区中有数据,则先输出到文件,再关闭。
三、文件的顺序读写
1、输入和输出一个字符
(1)输出一个字符到磁盘文件
形式,fputc( ch,fp )
ch, 字符变量
fp, 指向的 FILE的结构体的文件,fp 的值是用 fopen 函数打开文件
时得到的。
函数返回值:当函数成功时返回输出的字符,否则返回 EOF。
如,#include,stdio.h”
main ( )
{ FILE * fp;
char ch;
if ((fp=fopen(“file1.txt”,”w”))==NULL)
{ printf(“cannpt ipen this file.\n”);
exit(0); }
while (( ch=getchar( )!=?\n?)
fputc( ch,fp );
fclose( fp);
}
EOF的值在 stdio.h中定义为 -1。
(2)从磁盘文件中接收一个字符
形式,ch = fgetc (fp);
功能:从指针变量 fp所指向的文件中读入一个字符并赋给字符变量
ch, fgetc函数值就是该字符。
说明,fgetc函数遇到文件结束符,则函数返回文件结束 EOF。
如,#include,stdio.h”
main( )
{ FILE * fp;
char ch;
if ((fp=fopen(“file1.txt”,”r”))==NULL)
{ printf(“cannpt ipen this file.\n”);
exit(0);
}
while (( ch=fgetc (fp )!=EOF)
putchar( ch );
fclose( fp);
}
2、输入和输出一个字符串
(1)fgets函数
形式,fgets(str,n,fp)
功能:从 fp所指向的文件读取 n-1个字符,并放到字符数组 str中。
说明,1)在读入 n-1个字符完成前遇到,\n”或 EOF(文件结束符 ),即
结束读入。
2)“\n”也作为字符送入数组。读入的字符串之后自动加入
,\0”,故读入的字符数为 n-1。
3)函数返回值为 str 数组首地址。如读到文件尾或出借则返回
NULL。
例:从磁盘文件中读回字符串,并在屏幕上显示出来。
#include,stdio.h”
main( )
{ FILE *fp; char string[81];
if ((fp=fopen(“file2,txt”,”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (fgets(string,81,fp)!=NULL) printf(“%s\n”,string);
fclose(fp); }
(2)fputs函数
形式,fputs(str,fp)
功能:把字符数组 str中的字符串输出到 fp所指向的文件。
说明:字符串结束,\0”不输出。
例,#include,stdio.h”
main( )
{ FILE *fp; char string[81];
if ((fp=fopen(“file2,txt”,”w”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (strlen(gets(string))>0)
{ fputs(string,fp);
fputs(\n”,fp);
}
fclose(fp);
}
例:编写显示 ASCII文件命令。即 dos的 type命令。
#include,stdio.h”
main( int atgc,char *argc[ ])
{
FILE *fp; char string[81];
if ((fp=fopen(argc[1],”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (fgets(string,81,fp)!=NULL)
printf(“%s\n”,string);
fclose(fp);
}
例:编写一个复制文件的命令。即 dos的 copy命令。
#include,stdio.h”
main( int atgc,char *argc[ ])
{
FILE *fp1,*fp2;
char string[81];
if ((fp1=fopen(argc[1],”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
if ((fp2=fopen(argc[2],”w”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (fgets(string,81,fp1)!=NULL)
fputs(string,fp2);
fclose(fp1);
fclose(fp2);
}
3、格式化的输入和输出
格式化的输出,fprintf
例,#include,stdio.h”
main( )
{ FILE *fp; char name[20]; int num;float score;
if ((fp=fopen(“file3.txt”,”w”))==NULL)
{ printf(“can?t open file”);
exit(0);}
printf(“type name,num,score:”);
scanf(“%s %d %f”,name,&num,&score);
while(strlen(name)>1)
{ fprintf( fp,”%s %d %f”,name,num,score);
printf(“type name,num,score:”);
scanf(“%s %d %f”,name,&num,&score);
}
fclose(fp);
}
例,3、格式化的输入和输出
格式化的输入,fscanf
例,#include,stdio.h”
main( )
{ FILE *fp; char name[20]; int num;float score;
if ((fp=fopen(“file3.txt”,”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while(fscanf(fp,“%s %d %f”,name,&num,&score)!=EOF)
{ fprintf( fp,”%s %d %f”,name,num,score);
printf(“%-20s %6d %6.2f\n”,name,num,score);
}
fclose(fp);
}
4、按记录的方式输入输出
读入(输入)形式,fread(buffer,size,count,fp);
写入(输出)形式,fwrite(buffer,size,count,fp);
其中,
buffer:是一个指针,对 fread来说,是读入数据的存储区的起始地
址,对 fwrite来说,是将要输出的数据的存储区的起始地址。
size,为要读写的字节数。
count:表示要读写多少个 size字节的数据项。
fp,文件类型指针变量。
返回值:如果执行成功则返回 count的值。
如,fwrite(arr,100,2,fp);
表示从数组名 arr所代表的数组起始地址开始,每次输出 100个
字节的数据,共输出 2次,输出到 fp所指向的磁盘文件中。
注:按记录读写,必采用二进制文件的方法。
#include,stdio.h”
#include,stdlib.h”
main()
{ struct
{ char name[20];
long num;
float score;
}stud;
char numstr[81],ch;
FILE *fp;
if ((fp=fopen(“stud.ree”,”wb”))==NULL)
{ printf(“can?t open file”); exit(0);}
do { gers(stud.name);gets(numstr);stud.num=atol(numstr);
gets(numstr);stud.score=atof(numstr);
fwrite(&stud,sizeof(stud),1,fp);
ch=getchaar( ); getchar( );
}while(ch==?y?);
fclose(fp);
}
#include,stdio.h”
#include,stdlib.h”
main()
{ struct
{ char name[20];
long num;
float score;
}stud;
char numstr[81],ch;
FILE *fp;
if ((fp=fopen(“stud.ree”,”rb”))==NULL)
{ printf(“can?t open file”); exit(0);}
while(fread(&stud,sizeof(stud),1,fp)==1)
{ printf(“\n name,%s\n”,stud.name);
printf(“number:%ld\n”,stud.num);
printf(“score,%6.2f\n”,stud.score);
}
fclose(fp);
}
四、文件的定位与随机读写
通过移动指针实现随机读写。
1、文件的定位
1) fseek 函数
形式,fseek(文件类型指针,位移量,起始点);
起始点:指以什么地方为基准进行移动。
0,文件开始处
1,文件位置指针的当前指向
2,文件尾
位移量:向前移动的字节数。
如,fseek(fp,10L,0); 将位置指针移动到离文件开始处 10个字节处。
fseek(fp,-20L,1); 将位置指针从当前位置向后移 20个字节。
fseek(fp,-50L,2); 将位置指针从文件末尾后移 50个字节。
如果执行 fseek函数成功,函数值返回 0,失败则返回一个非零值。
2) ftell函数
形式,ftell(fp)
功能:返回位置指针的当前向。出错返回 -1。
3) rewind函数
功能,使位置指针重新返回到文件的开头处。
#include,stdio.h”
main( )
{struct
{ char name[20];
long num;
float score;
}stud;
FILE *fp;
int rec_no;
long offset;
if ((fp=fopen(“stud.ree”,”rb”))==NULL)
{ printf(“can?t open file”); exit(0);}
scanf(“%d”,&rec_no);
offset=(rec_no)*sizeof(stud);
if (fseek(fp,offset,0)!=0)
{ printf(“can?t move pointer there”); exit(0);}
fread(&stud,sizeof(stud),1,fp);
print(“name:%s\nnumber:%ld\nscore:%6.2f\n”,stud.name,stud.nu
m,stud.score);fclose(fp);}
#include,stdio.h”
char buffer[32767];
main( int argc,char *argv[ ] )
{ FILE *fp1,*fp2;
unsigner int byters,bfsz=32767;
unsigner long i=0;
if ((fp1=fopen(argv[1],”rb”))==0)
{printf(“can?t oprn file %s.”,argv[1];exit(0);}
if ((fp1=fopen(argv[2],”wb”))==0)
{printf(“can?t oprn file %s.”,argv[2];exit(0);}
while(bfsz)
{ if (fread(buff,bfsz,1,fp1)
{ fwrite(buff,bfsz,1,fp2); i+=bfsz; }
else { fseek(fp1,i,0);bfsz=bfsz/2; }
}
fclose(fp1);fclose(fp2);
}
小结,
1、一个字符的输入和输出
fgetc(fp) fputc( ch fp)
2、一个字符串的输入输出
fgets(str,n,fp) fputs(str,fp)
3、格式化输入和输出
fscanf fprintf
4、记录读写 fread( ) fwrite( )
5,feek ftell rewind feof eof
教学目的:掌握相关文件概念,文件打开、关闭函数、指针操作定
义、顺序文件读写函数及应用。
重点:相关文件概念、文件操作函数、顺序文件操作。
难点:文件信息区、缓冲区、文件指针概念、定义及各函数应用。
预习,
字符和字符串操作函数
标准输入输出设备
一、文件概述
1、文件的概述
文件:记录在外部介质中的数据集合。
文件分类,
按介质:磁盘文件、磁带文件、光盘文件等。
按内容:源程序、目标文件、数据文件等。
按组织形式:字符代码文件、二进制文件等。
字符代码文件:每个字符占一个字节。
二进制文件:按内容中的存储形式存放。如整型点两字节。
2、标准( I/O)和系统( I/O)
C语言磁盘文件系统分两大类,
1) 缓冲文件系统(又称高层文件系统或标准文件系统)。
自动为文件设缓冲区。
2) 非缓冲文件系统(又称低层文件系统) 。
用户自己设置缓冲区。
缓冲区:提高数据读写速度在内容中设置的一块区域。
文件与缓冲区间关系见下页。
缓冲文件系统特点:对程序中的每一个文件都在内存中开辟一个
“缓冲区”。
读写文件数据的函数见表 9.1。
fgetc,fputc,fgets,fputs,fscanf,fprintf。
3、文件 (FILE)类型指针
FILE:是文件类型名,是一个由系统定义的结构体类型,各成员
为文件操作所需信息。
文件信息(区):读写位置、内存缓冲区地址、缓冲区未处理字符
数、文件操作方式等。
“文件信息区”在内存中是一个结构体变量。
对 FILE的定义是在 stdio.h头文件中由系统事先指定的。
只要程序用到一个文件,系统就为此文件开辟一个如上的结构体变
量。
a
程序数据区
输入 (出 )文
件缓冲区
磁盘文件
内存
定义指针变量,
如,FILE *fpt1,*fpt2,*fpt3;
FILE是文件类型指针,所定义的指针变量都是指向文件的。即指
向文件的信息区(文件信息区在内存中是一个结构体变量)。
定义格式,FILE * 文件结构体指针变量名表;
二、文件的打开与关闭
1、文件的打开
打开:在程序和操作系统之间建立联系。
格式,fopen (“文件名”,“文件使用方式” );
如,fopen (,file1”,”r”);
文件使用方式,r,只读,w:只写,a:追加
b,二进制文件 +,读写
r,w,a 可以与 b, + 结合,如 rb+。
文件 1的信息
区(结构体
变量)
文件 3的信息
区(结构体
变量)
文件 2的信息
区(结构体
变量)
fpt1 fpt2 fpt3
fopen函数返回值是一个地址(被打开文件的信息区)。
NULL:返回值为 0,即读时文件不存在,或写时磁盘满。
打开文件时,程序通知编译系统三个方面的信息,
1)要打开哪一个文件; 2)对文件的使用方式; 3)函数的返回值赋给
哪一个指针变量 。
文件打开方法,
if ((fp=fopen(“file1”,”r”))==NULL)
{ printf(“cannot open this file \n”);
exit(0);
}
exit(0):正常退出; exit(-1):出错退出(括号内非零)。
C程序 操作 系统 磁盘
文件名
文件使用
方式
指向文件
的指针
对磁盘文件,在使用前先要打开,而对 终端设备,也是作为文件 来
处理。
系统默认 的标准设备指针变量,
标准输入 stdin
标准输出 stdoit
标准出错输出 stderr
以上三个文件都是以终端设备为输入输出对象的。
如:指定输出一个数据到 stdout所指向的文件,就是指输出到终端
设备。
为使用方便,C程序中不必指定这三个文件,可以直接输入输出
处理,但指的都是标准的终端设备。
2、文件的关闭
格式,fclose(文件指针变量 );
功能:释放文件信息区(结构体变量)。
注:若此时缓冲区中有数据,则先输出到文件,再关闭。
三、文件的顺序读写
1、输入和输出一个字符
(1)输出一个字符到磁盘文件
形式,fputc( ch,fp )
ch, 字符变量
fp, 指向的 FILE的结构体的文件,fp 的值是用 fopen 函数打开文件
时得到的。
函数返回值:当函数成功时返回输出的字符,否则返回 EOF。
如,#include,stdio.h”
main ( )
{ FILE * fp;
char ch;
if ((fp=fopen(“file1.txt”,”w”))==NULL)
{ printf(“cannpt ipen this file.\n”);
exit(0); }
while (( ch=getchar( )!=?\n?)
fputc( ch,fp );
fclose( fp);
}
EOF的值在 stdio.h中定义为 -1。
(2)从磁盘文件中接收一个字符
形式,ch = fgetc (fp);
功能:从指针变量 fp所指向的文件中读入一个字符并赋给字符变量
ch, fgetc函数值就是该字符。
说明,fgetc函数遇到文件结束符,则函数返回文件结束 EOF。
如,#include,stdio.h”
main( )
{ FILE * fp;
char ch;
if ((fp=fopen(“file1.txt”,”r”))==NULL)
{ printf(“cannpt ipen this file.\n”);
exit(0);
}
while (( ch=fgetc (fp )!=EOF)
putchar( ch );
fclose( fp);
}
2、输入和输出一个字符串
(1)fgets函数
形式,fgets(str,n,fp)
功能:从 fp所指向的文件读取 n-1个字符,并放到字符数组 str中。
说明,1)在读入 n-1个字符完成前遇到,\n”或 EOF(文件结束符 ),即
结束读入。
2)“\n”也作为字符送入数组。读入的字符串之后自动加入
,\0”,故读入的字符数为 n-1。
3)函数返回值为 str 数组首地址。如读到文件尾或出借则返回
NULL。
例:从磁盘文件中读回字符串,并在屏幕上显示出来。
#include,stdio.h”
main( )
{ FILE *fp; char string[81];
if ((fp=fopen(“file2,txt”,”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (fgets(string,81,fp)!=NULL) printf(“%s\n”,string);
fclose(fp); }
(2)fputs函数
形式,fputs(str,fp)
功能:把字符数组 str中的字符串输出到 fp所指向的文件。
说明:字符串结束,\0”不输出。
例,#include,stdio.h”
main( )
{ FILE *fp; char string[81];
if ((fp=fopen(“file2,txt”,”w”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (strlen(gets(string))>0)
{ fputs(string,fp);
fputs(\n”,fp);
}
fclose(fp);
}
例:编写显示 ASCII文件命令。即 dos的 type命令。
#include,stdio.h”
main( int atgc,char *argc[ ])
{
FILE *fp; char string[81];
if ((fp=fopen(argc[1],”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (fgets(string,81,fp)!=NULL)
printf(“%s\n”,string);
fclose(fp);
}
例:编写一个复制文件的命令。即 dos的 copy命令。
#include,stdio.h”
main( int atgc,char *argc[ ])
{
FILE *fp1,*fp2;
char string[81];
if ((fp1=fopen(argc[1],”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
if ((fp2=fopen(argc[2],”w”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while (fgets(string,81,fp1)!=NULL)
fputs(string,fp2);
fclose(fp1);
fclose(fp2);
}
3、格式化的输入和输出
格式化的输出,fprintf
例,#include,stdio.h”
main( )
{ FILE *fp; char name[20]; int num;float score;
if ((fp=fopen(“file3.txt”,”w”))==NULL)
{ printf(“can?t open file”);
exit(0);}
printf(“type name,num,score:”);
scanf(“%s %d %f”,name,&num,&score);
while(strlen(name)>1)
{ fprintf( fp,”%s %d %f”,name,num,score);
printf(“type name,num,score:”);
scanf(“%s %d %f”,name,&num,&score);
}
fclose(fp);
}
例,3、格式化的输入和输出
格式化的输入,fscanf
例,#include,stdio.h”
main( )
{ FILE *fp; char name[20]; int num;float score;
if ((fp=fopen(“file3.txt”,”r”))==NULL)
{ printf(“can?t open file”);
exit(0);}
while(fscanf(fp,“%s %d %f”,name,&num,&score)!=EOF)
{ fprintf( fp,”%s %d %f”,name,num,score);
printf(“%-20s %6d %6.2f\n”,name,num,score);
}
fclose(fp);
}
4、按记录的方式输入输出
读入(输入)形式,fread(buffer,size,count,fp);
写入(输出)形式,fwrite(buffer,size,count,fp);
其中,
buffer:是一个指针,对 fread来说,是读入数据的存储区的起始地
址,对 fwrite来说,是将要输出的数据的存储区的起始地址。
size,为要读写的字节数。
count:表示要读写多少个 size字节的数据项。
fp,文件类型指针变量。
返回值:如果执行成功则返回 count的值。
如,fwrite(arr,100,2,fp);
表示从数组名 arr所代表的数组起始地址开始,每次输出 100个
字节的数据,共输出 2次,输出到 fp所指向的磁盘文件中。
注:按记录读写,必采用二进制文件的方法。
#include,stdio.h”
#include,stdlib.h”
main()
{ struct
{ char name[20];
long num;
float score;
}stud;
char numstr[81],ch;
FILE *fp;
if ((fp=fopen(“stud.ree”,”wb”))==NULL)
{ printf(“can?t open file”); exit(0);}
do { gers(stud.name);gets(numstr);stud.num=atol(numstr);
gets(numstr);stud.score=atof(numstr);
fwrite(&stud,sizeof(stud),1,fp);
ch=getchaar( ); getchar( );
}while(ch==?y?);
fclose(fp);
}
#include,stdio.h”
#include,stdlib.h”
main()
{ struct
{ char name[20];
long num;
float score;
}stud;
char numstr[81],ch;
FILE *fp;
if ((fp=fopen(“stud.ree”,”rb”))==NULL)
{ printf(“can?t open file”); exit(0);}
while(fread(&stud,sizeof(stud),1,fp)==1)
{ printf(“\n name,%s\n”,stud.name);
printf(“number:%ld\n”,stud.num);
printf(“score,%6.2f\n”,stud.score);
}
fclose(fp);
}
四、文件的定位与随机读写
通过移动指针实现随机读写。
1、文件的定位
1) fseek 函数
形式,fseek(文件类型指针,位移量,起始点);
起始点:指以什么地方为基准进行移动。
0,文件开始处
1,文件位置指针的当前指向
2,文件尾
位移量:向前移动的字节数。
如,fseek(fp,10L,0); 将位置指针移动到离文件开始处 10个字节处。
fseek(fp,-20L,1); 将位置指针从当前位置向后移 20个字节。
fseek(fp,-50L,2); 将位置指针从文件末尾后移 50个字节。
如果执行 fseek函数成功,函数值返回 0,失败则返回一个非零值。
2) ftell函数
形式,ftell(fp)
功能:返回位置指针的当前向。出错返回 -1。
3) rewind函数
功能,使位置指针重新返回到文件的开头处。
#include,stdio.h”
main( )
{struct
{ char name[20];
long num;
float score;
}stud;
FILE *fp;
int rec_no;
long offset;
if ((fp=fopen(“stud.ree”,”rb”))==NULL)
{ printf(“can?t open file”); exit(0);}
scanf(“%d”,&rec_no);
offset=(rec_no)*sizeof(stud);
if (fseek(fp,offset,0)!=0)
{ printf(“can?t move pointer there”); exit(0);}
fread(&stud,sizeof(stud),1,fp);
print(“name:%s\nnumber:%ld\nscore:%6.2f\n”,stud.name,stud.nu
m,stud.score);fclose(fp);}
#include,stdio.h”
char buffer[32767];
main( int argc,char *argv[ ] )
{ FILE *fp1,*fp2;
unsigner int byters,bfsz=32767;
unsigner long i=0;
if ((fp1=fopen(argv[1],”rb”))==0)
{printf(“can?t oprn file %s.”,argv[1];exit(0);}
if ((fp1=fopen(argv[2],”wb”))==0)
{printf(“can?t oprn file %s.”,argv[2];exit(0);}
while(bfsz)
{ if (fread(buff,bfsz,1,fp1)
{ fwrite(buff,bfsz,1,fp2); i+=bfsz; }
else { fseek(fp1,i,0);bfsz=bfsz/2; }
}
fclose(fp1);fclose(fp2);
}
小结,
1、一个字符的输入和输出
fgetc(fp) fputc( ch fp)
2、一个字符串的输入输出
fgets(str,n,fp) fputs(str,fp)
3、格式化输入和输出
fscanf fprintf
4、记录读写 fread( ) fwrite( )
5,feek ftell rewind feof eof