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

5.2. Файловий обмін рядками символів

Зчитування рядка символів з потоку введення виконує функція

char* fgets (char* str, int max, FILE* fp);

На відміну від gets (), дана функція має три параметри: перший - str вказує на масив символів, в який буде записано введений рядок; другий - max задає максимальну кількість символів (з нуль-символом включно), яку може містити зчитаний рядок; останній параметр - fp вказує на потік, з якого вводяться рядки.

У разі успішного виконання функція fgets () повертає адресу першого символа введеного рядка, тобто str, а в разі невдачі, зокрема, якщо досягнуто кінця файла, вказівник NULL.

Параметр str має вказувати на ділянку оперативної пам'яті, обсяг якої достатній для збереження зчитаного рядка. Параметр max обмежує кількість символів, які вводяться з потоку, тому розмір масиву str має бути не меншим за max. Дія функції така: з потоку fp у ділянку оперативної пам'яті, на яку вказує str, зчитується послідовність символів до символу нового рядка чи символу кінця файлу, але не більше, ніж mах-1 символів. Якщо в процесі введення зчитується символ '\n', то він заноситься у str, за ним записується '\0' і процес введення припиняється. У протилежному разі в str послідовно заноситься mах-1 символів потоку, за якими записується нуль-символ.

Запис заданого рядка в потік виведення здійснює функція

int fputs (char* str, FILE* fp);

яка повертає ненульове значення за умови успішного виконання та EOF у разі невдачі.

У процесі виконання fputs () послідовно передає у потік fp символи рядка str до '\0'. Сам нуль-символ у потік не записується і не перетворюється в інші символи Якщо в рядку зустрічається символ нового рядка, а потік виведення текстовий то замість символу “\n” у потік записується комбінація символів "\r\n". Для бінарних потоків жодні заміни символів не виконуються.

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

/* Посторінкове виведення текстового файла */

#include <stdio.h>

#include <conio.h> /* для функцій clrscr() і getch() */

#define LEN 81 /* розмірність буфера рядків тексту */

#define NROWS 22 /* розмір сторінки виведення */

int main ()

FILE * f ;

char buf[LEN];

char fname [] = "newtext.txt";

int n = 0 ;

if ( (f = fopen(fname, "rt")) =-= NULL)

{

printf("\n\t Файл %s не знайдено\n", fname);

return 0;

}

clrscr(); /* очищення екрана */

n = 0;

while (fgets (buf, LEN, f) != NULL)

{

fputs(buf, stdout); /* відображення зчитаного рядка */

if (++n % NROWS == 0) { /* заповнено сторінку */

printf("\n\t\t Page %d \n", NROWS);

getch (); /* затримка зображення */

}

}

printf("\n\t\t End of file. \n");

getch ();

fclose (f);

return 0;

}

У цій програмі розмірність рядка введення LEN дорівнює розміру екранного рядка -80 символів (плюс байт на ‘\0’), що полегшує підрахунок кількості висвітлених на екрані рядків.

Для виведення символьних рядків попередня програма використовує функцію

fputs(buf, stdout);

щоб відобразити на екрані текст так, як він записаний у файлі.

Якби виведення зчитаних з файлу рядків виконувалось функцією puts (buf), то після кожного рядка, що завершується символом “\n”, на екран додатково виводився б порожній рядок, оскільки puts () замінює кінцевий нуль-символ стрічки символом “\n”.

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