if ((fp = fopen(*++argv, "r")) == NULL) {
fprintf(stderr, "%s: не могу открыть файл %s\n", prog, *argv);
exit(1);
} else {
filecopy(fp, stdout);
fclose(fp);
}
if (ferror(stdout)) {
fprintf(stderr, "%s: ошибка записи в stdout\n", prog);
exit(2);
}
exit(0);
}
Программа сигнализирует об ошибках двумя способами. Первый - сообщение об ошибке с помощью
Второй способ указать на ошибку - обратиться к библиотечной функции exit, завершающей работу программы. Аргумент функции
Инструкция return
int ferror(FILE *fp)
Хотя при выводе редко возникают ошибки, все же они встречаются (например, оказался переполненным диск); поэтому в программах широкого пользования они должны тщательно контролироваться.
Функция feof(
int feof(FILE *fp);
В наших небольших иллюстративных программах мы не заботились о выдаче статуса выхода, т. е. выдаче некоторого числа, характеризующего состояние программы в момент завершения: работа закончилась нормально или прервана из-за ошибки? Если работа прервана в результате ошибки, то какой? Любая серьезная программа должна выдавать статус выхода.
7.7 Ввод-вывод строк
В стандартной библиотеке имеется программа ввода fgets, аналогичная программе
char *fgets(char *line, int maxline, FILE *fp)
Функция
Функция вывода fputs пишет строку (которая может и не заканчиваться символом новой строки) в файл.
int fputs(char *line, FILE *fp)
Эта функция возвращает EOF, если возникла ошибка, и неотрицательное значение в противном случае.
Библиотечные функции gets и puts подобны функциям
Чтобы показать, что ничего особенного в функциях вроде
/* fgets: получает не более n символов из iop */
char *fgets(char *s, int n, FILE *iop) {
register int c;
register char *cs;
cs = s;
while (--n › 0 && (с = getc(iop)) != EOF)
if ((*cs++ = c) == '\n')
break;
*cs= '\0';
return (c == EOF && cs == s) ? NULL : s;
}
/* fputs: посылает строку s в файл iop */
int fputs(char *s, FILE *iop)
{
int c;
while (c = *s++)
putc(c, iop);
return ferror(iop) ? EOF : 0;
}