Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_11_Pres.doc
Скачиваний:
4
Добавлен:
05.12.2018
Размер:
377.86 Кб
Скачать

5. Функції потокового введення/виведення даних

Функції високорівневого обміну даними з файлами можна поділити на чотири групи відповідно до формату даних, що передаються за одну операцію читання/запису:

  • функції посимвольного введення/виведення;

  • функції рядкового введення/виведення;

  • функції блокового введення/виведення;

  • функції форматного введення/виведення.

Всі операції введення/виведення даних виконуються, починаючи з поточної позиції файлу, яку зберігає спеціальний вказівник. У процесі введення цей покажчик автоматично зсувається на відповідну кількість байтів у напрямку до кінця потоку і встановлюється на перший ще непрочитаний байт. У процесі виведення даних покажчик поточної позиції файлу автоматично встановлюється за останнім записаним байтом.

5.1. Посимвольний обмін даними

Введення одного символу. Основною функцією зчитування одного символу з потоку введення fp є функція

int fgetc (FILE* fp);

У разі успішного виконання функція fgetc () повертає код зчитаного символу як значення з типом unsigned char, розширене до формату int. Якщо ж читання з потоку недоступне, зокрема через досягнення кінця файлу, то функція повертає макро-константу EOF.

Такі ж дії виконує функція

int getc (FILE* fp);

яку в середовищі Borland C та в ряді інших систем програмування оголошено як макрос, що викликає функцію fgetc ().

Якщо параметром названих функцій є стандартний потік введення stdin, то їх дія повністю збігається з дією функцій введення символів з клавіатури fgetchar () і getchar (). Результат виклику кожної з чотирьох наступних функцій однаковий:

fgetc(stdin) = getc(stdin) = fgetchar() = getchar();

- зчитування одного символа, введеного з клавіатури і записаного в буфер стандартного потоку введення (якщо потік stdin попередньо не перескерували).

Функція

int ungetc (int symb, FILE* fp);

дає змогу повернути в потік введення fp останній зчитаний символ. Після повернення symb стає першим символом потоку, його буде зчитано довільною наступною операцією введення. Функція ungetc () повертає код символа symb у разі успішного завершення, а у разі невдачі - значення EOF.

Наведемо приклад функції, яка реалізує зчитування послідовності цифрових символів зі заданого відкритого потоку frd та запис введених цифр за адресою numbst. Робота функції завершується, коли зчитується символ, який не є цифрою - цей символ функція повертає назад у потік.

/* Функція введення послідовності цифрових символів */

#include <stdio.h>

#include <ctype.h>

char* ReadNumber (char* numbst, FILE* frd)

{ char * pn = numbst;

int symb;

while (isdigit (symb = getc( frd))) /* isdigit – повертає числові значення 0 - 9

*pn++ = symb; /* запис цифрових символів у numbst

*pn = '\0'; /* кінець числового рядка

ungetc (symb, frd); /* повернення нечислового символа

return numbst;

}

Запис символа у файл. Запис заданого символа symb у потік виведення fp виконують функції

int fputc (int symb, FILE* fp);

та

int putc (int symb, FILE* fp);

Другу з цих функцій у Borland C реалізовано як макрос. Обидві функції за умови успішного виконання повертають код записаного символу. У разі помилки звертання до файлу функції повертають значення макроконстанти EOF.

Проілюструємо використання функцій посимвольного потокового введення ведення прикладом програми, яка відображає на екрані весь вміст текстового файлу

/******************************************************************/

/* Посимвольне виведення вмісту заданого файлу */

/******************************************************************/

#include <stdio.h>

#include <string.h>

int main (int argc, char** argv)

{

FILE * fp;

char fname[50];

int c;

if (argc == l) { /* ім'я файла у командному рядку не задано */

printf("Ім\'я файла: ");

gets(fname); }

else

strcpy(fname, argv[1]); /* ім'я зчитується з командного рядка */

fp = fopen(fname,"r");

if (fp == NULL) {

printf ("Хибне ім\'я файла - %s \n", fname);

return 0; }

while ((c = getc(fp) ) != EOF) /* цикл зчитування файла */

putc(c, stdout); /* посимвольне відображення на екрані */

fclose(fp);

return 0; }

Наведена вище програма дає змогу задати ім'я файлу з командного рядка або ввести його в процесі виконання програми. Хоча зчитування файлу здійснюється посимвольно, все ж програма забезпечує високу швидкодію обміну, оскільки реально символи зчитуються не з файлу на зовнішньому носії, а з буфера введення в оперативній пам'яті.

Недолік програми в тому, що для великих за розміром файлів на екрані збережеться тільки остання сторінка тексту, а всі решта будуть витерті автоматичним скролінгом. Приклад посторінкового виведення файлу подано далі.

Відображення символів, зчитаних з файлу, у програмі реалізовано як посимвольне виведення у стандартний потік stdout. Загалом, виведення символу symb на екран (або в файл, якщо stdout попередньо перескерували) можна виконати кожним із чотирьох наступних викликів функцій:

fputc(symb, stdout); putc(symb, stdout);

fputchar(symb); putchar(symb);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]