русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Ввід і вивід рядків


Дата додавання: 2014-11-28; переглядів: 828.


Стандартна бібліотека надає функцію вводу і виводу 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. Напишіть програму видруку набору файлів, починаючи кожний на новій сторінці, з титулом і відліком сторінок для кожного файла.


<== попередня лекція | наступна лекція ==>
Обробка помилок - stderr і exit | Перевірка і перетворення класів символів


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн