我試圖模仿Unix工具貓的行爲,但是當我打電話的形式的命令不讀:從標準適當
貓文件1 - 文件2 - 文件3
我的程序將輸出file1正確,然後從標準輸入讀入,然後當我按下EOF時,它將打印文件2,然後是文件3,而不從第二次讀取標準輸入。
爲什麼會這樣呢?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ASCII_LENGTH 255
int printfile(FILE *source, int N);
int main(int argc, char *argv[])
{
int currentarg = 1; //the argument number currently being processed
FILE *input_file;
//if there are no arguments, dog reads from standard input
if(argc == 1 || currentarg == argc)
{
input_file = stdin;
printfile(input_file,0);
}
else
{
int i;
for(i = currentarg; i < argc; i++)
{
printf("%d %s\n",i,argv[i]);
//if file is a single dash, dog reads from standard input
if(strcmp(argv[i],"-") == 0)
{
input_file = stdin;
printfile(input_file,0);
fflush(stdin);
fclose(stdin);
clearerr(stdin);
}
else if ((input_file = fopen(argv[i], "r")) == NULL)
{
fprintf(stderr, "%s: %s: No such file or directory\n", argv[0], argv[i]);
return 1;
}
else
{
printfile(input_file,0);
fflush(input_file);
fclose(input_file);
clearerr(input_file);
}
}
}
return 0;
}
int printfile(FILE *source, int N)
{
//used to print characters of a file to the screen
//characters can be shifted by some number N (between 0 and 25 inclusive)
char c;
while((c = fgetc(source)) != EOF)
{
fputc((c+N)%ASCII_LENGTH,stdout);
}
printf("***** %c %d",c,c==EOF);
return 0;
}
我不認爲你考慮看[貓的源代碼](http://www.scs.stanford.edu/histar//src/pkg/cat/cat.c) – paddy
'fopen'失敗除了'ENOENT'之外的許多原因。檢查「strerror」和「perror」文檔。不要理由:讓系統告訴你。 –
您關閉'stdin',難怪它下次關閉;-) – vonbrand