Стандартна бібліотека надає функцію вводу і виводу fgets, аналогічну getline, яку ми використовували в попередніх розділах:
char *fgets(char *line, int maxline, FILE *fp)
fgets читає наступний рядок вводу (включаючи символ нового рядка) з файла fp у символьний масив line; щонайбільше maxline-1 знаків буде прочитано. Отриманий в результаті рядок буде завершено '\0'. Звично, fgets повертає рядок; у випадку кінця файла або помилки, вона повертає NULL. (Наша getline повертає довжину рядка, — корисніше значення; нуль означає кінець файла.)
Для виводу, функція fputs записує ланцюжок (який не повинен включати символ нового рядка) до файла:
int fputs(char *line, FILE *fp)
Вона повертає EOF, якщо відбулася помилка і додатнє значення у протилежному випадку.
Функції бібліотеки gets і puts тотожні fgets і fputs, але оперують над stdin і stdout. Плутанину викликає те, що gets видаляє кінцевий '\n', тоді як puts додає його.
Щоб продемонструвати, що немає нічого особливого в таких функціях як fgets і fputs, ось вони, будь-ласка, скопійовані зі стандартної бібліотеки до нашої системи:
/* fgets: отримує щонайбільше n символів з iop */
char *fgets(char *s, int n, FILE *iop)
{
register int c;
register char *cs;
cs = s;
while (--n > 0 && (c = 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;
}
З невідомих причин, стандарт вказує на відмінні значення повернення для ferror і fputs. Досить легко втілити нашу getline за допомогою fgets:
/* getline: читає рядок, повертає довжину */
int getline(char *line, int max)
{
if (fgets(line, max, stdin) == NULL)
return 0;
else
return strlen(line);
}
Вправа 7-6. Напишіть програму по порівнянню двох файлів, виводячи перший рядок, там де вони відрізняються.
Вправа 7-7. Змініть програму знаходження по шаблону з Розділу 5 таким чином, щоб вона брала свій ввід з набору вказаних файлів, або, якщо жодного файла не вказано як аргумент, зі стандартного вводу. Можливо, можна також виводити назву файла, в якому знайдено рядок, що співпав.
Вправа 7-8. Напишіть програму видруку набору файлів, починаючи кожний на новій сторінці, з титулом і відліком сторінок для кожного файла.