- •Лекція № 11 обмін даними з файлами
- •1. Файли і потоки, буферизація даних
- •2. Групи функцій для роботи з потоками
- •3. Відкриття/закриття потоків
- •3.1. Відкриття потоків.
- •4. Стандартні потоки, перескерування потоків
- •5. Функції потокового введення/виведення даних
- •5.1. Посимвольний обмін даними
- •5.2. Файловий обмін рядками символів
- •5.3. Обмін блоками даних
- •5.4. Форматне введення/виведення даних
- •6. Встановлення поточної позиції файлу
- •7. Функції аналізу помилок
- •8. Керування буферизацією даних
- •9. Витирання та перейменування файлів
- •10. Інші засоби для роботи з файлами
- •10.2. Низькорівневе звертання до файлів
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”.