#include <stdio.h>
/*cat : concatenate files, version 1*/
main(int argc, char *argv[]){
FILE *fp;
void filecopy(FILE *, FILE *);
if(argc == 1)/*no args; copy standard input*/
filecopy(stdin, stdout);
else
while(--argc > 0)
if((fp = fopen(*++argv, "r")) == NULL){
printf("cat : can't open %s\n", * argv);
return 1;
}
else{
filecopy(fp, stdout);
fclose(fp);
}
return 0;
}
/* filecopy : copy file ifp to file ofp*/
void filecopy(FILE *ifp, FILE *ofp){
int c;
while((c = getc(ifp)) != EOF){
putc(c, ofp);
}
}
其中,main函数中的第二行代码void filecopy(FILE *, FILE *);是对filecopy函数的声明。也可以放在main函数的前面。但其作用域有所不同。在main函数外面声明的函数全局可用,在main函数里面声明的函数只在main函数内部可用。
下面对以上程序进行了一些改进,加入了对出错情况的处理。
#include <stdio.h>
/*cat : concatenate files, version 2*/
main(int argc, char *argv[]){
void filecopy(FILE *, FILE *);
FILE *fp;
char *prog = argv[0];/*program name for errors*/
if(argc == 1)/*no args; copy standard input*/
filecopy(stdin, stdout);
else{
while(--argc > 0)
if((fp = fopen(*++argv, "r")) == NULL){
fprintf(stderr, "%s : can't open %s\n", prog, * argv);
exit( 1 );
}
else{
filecopy(fp, stdout);
fclose(fp);
}
}
if(ferror(stdout)){
fprintf(stderr, "%s: error writing stdout\n", prog);
exit(2);
}
}
/* filecopy : copy file ifp to file ofp*/
void filecopy(FILE *ifp, FILE *ofp){
int c;
while((c = getc(ifp)) != EOF){
putc(c, ofp);
}
}