#include <stdio.h>
/*
FILE *fp;
【1】FILE *fopen(char *name, char *mode);
【2】// 流fp出现错误,返回非0值
int ferror(FILE *fp)
【3】// 到达文件末尾,返回非0值
int feof(FILE *fp)
【4】// 返回fp指向的输入流中的下一个字符,文件尾或错误返回EOF
int getc(FILE *fp);
【5】// 将字符c写入到fp指向的文件中,并返回写入的字符。错误返回EOF
int putc(int c, FILE *fp);
【6】
#define getchar() getc(stdin)
#define putchar() putc((c), stdout)
【7】
int fscanf(FILE *fp, char *format, ...)
int fprintf(FILE *fp, char *format, ...)
【8】
// 从fp中读取maxline - 1 个字符并以'\0'结尾保存到数组line中。
// 通常返回line遇文件结尾或发生错误返回NULL。
char *fgets(char *line, int maxline, FILE *fp)
// 将一个字符串写入到一个文件中。
// 发生错误返回EOF,否则返回一个非负值。
char *fputs(char *line, FILE *fp)
【9】
// 与fgets和fputs类似,但其对stdin,stdout进行操作
gets在每行末尾删除'\n'
puts在每行末尾添加'\n'
char *gets(char *s);
int puts(const char *s);
*/
/* cat函数的实现 */
int main(int argc, char *argv[])
{
FILE *fp;
void filecopy(FILE *, FILE *);
if(argc == 1) /* 若没有命令行参数,则复制标准输入 */
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函数: 将文件ifp复制到文件ofp */
void filecopy(FILE *ifp, FILE *ofp)
{
int c;
while((c = getc(ifp)) != EOF)
putc(c, ofp);
}