下面使用一个函数示例说明这些函数的用法。该程序把一系列文件中的内容附加在另一个文件的末尾。
#include
#include
#include
#define BUFSIZE 4096
#define SLEN 81
void append(FILE*source,FILE*dest);
char*s_get(char*st,int n);
int main(void)
{
FILE*fa,*fs; //fa指向目标文件,fs指向源文件
int files=0; //附加文件的数量
char files_app[SLEN]; //目标文件名
char files_src[SLEN]; //源文件名
int ch;
puts("Enter name of destination file:");
s_gets(file_app,SLEN); //获取目标文件名
if(fa=fopen(file_app,"a+"))==NULL)
{
fprintf(stderr,"Can't open %s\n",file_app); //输出到标准错误流,无法打开文件
exit(EXIT_FAILURE);
}
if(setvbuf(fa,NULL,_IOFBF,BUFSIZE)!=0)
{
fputs("Can't create output buffer\n",stderr);
exit(EXIT_FAILURE);
}
puts("Enter name of first source file (empty line to quit):");
while(s_gets(file_src,SLEN)&&file_src[0]!='\0')
{
if(strcmp(file_src,file_app)==0)
fputs("Can't append file to itself",stderr));
else if((fs=fopen(file_src,"r")==NULL)
fprintf(stderr,"Can't open %s\n",file_src);
else
{
if(setvbuf(fs,NULL,_IOFBF,BUFSIZE!=0)
{
fputs("Can't create input buffer\n",stderr);
continue;
}
append(fs,fa);
if(ferror(fs)!=0)
fprintf(stderr,"Error in reading file %s.\n",file_src);
if(ferror(fa)!=0)
fprintf(stderr,"Error in reading file %s.\n",file_app);
fclose(fs);
files++;
printf("File %s appended.\n",file_src);
puts("Next file (empty line to quit):");
}
}
printf("Done appending. %d files appended.\n",files);
rewind(fa);
printf("%s contents:\n",file_app);
while((ch=getc(fa))!=EOF)
putchar(ch);
puts("Done displaying.");
fclose(fa);
return 0;
}
void append(FILE*source,FILE*dest)
{
size_t bytes;
static char temp[BUFSIZE];//只分配一次
while((bytes=fread(temp,sizeof(char),BUFSIZE,source))>0)
fwrite(temp,sizeof(char),bytes,dest);
}
char*s_gets(char*st,int n)
{
char*ret_val;
char*find;
ret_val=fgets(st,n,stdin);
if(ret_val)
{
find=strchr(st,'\n');//查找换行符
if(find) //如果地址不是NULL
*find='\0'; //在此处放置一个空字符
else
while(getchar()!='\n');
continue;
}
return ret_val;
}