Звонок на fputs
, который вы прокомментировали в concat
, пытается записать в fp
, который вы открыли только для чтения, поэтому неудивительно, что он не будет / не работает.
Кроме этого, ваши циклы чтения: while(!feof(fp)) {
(и аналогичные, кроме stdin
вместо fp
) следуют знакомому, широко распространенному анти-паттерну - подобные циклы не / не будут / могут не работает правильно. Обычно вы хотите прочитать и проверить на успех в той же операции:
while(fgets(string, 256, stdin))
fputs(string, stdout);
Редактировать: Я должен также упомянуть, что я бы предпочел избежать дублирования кода в concat
и stdincat
. Я предпочел бы передать FILE *
для чтения в качестве параметра, чтобы вы использовали тот же код для чтения из stdin
или из других произвольных файлов:
// Warning: untested code.
// error checking omitted for readability.
void catfile(FILE *file) {
char line[256];
while (fgets(line, sizeof(line), file))
puts(line);
}
int main(int argc, char **argv) {
int i;
if (argc == 1)
catfile(stdin);
else for (int i=1; i<argc; i++) {
FILE *infile = fopen(argv[i], "r");
catfile(infile);
fclose(infile);
}
return 0;
}
Наконец, я хотел бы отметить, что если вы собираетесь скопировать весь файл, fgets
, вероятно, является , а не наиболее эффективным способом выполнения этой работы. fread
может быть более подходящим. Пока вы работаете над этим, вы также можете использовать чтение и запись в двоичном режиме.