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

5.3. Обмін блоками даних

Функції fread() та fwrite (). Зчитати з потоку блок даних заданого розміру можна за допомогою функції

size_t fread (void* buf, size_t size, size_t n, FILE* fp);

що заносить у буфер, адресу якого задає параметр buf, n об'єктів, кожен з яких має розмір size. Тип size_t оголошено в <stdio.h> через декларацію typedef. У Borland C він збігається з типом unsigned int.

Функція fread () повертає кількість реально зчитаних об'єктів (не байтів). Якщо ця величина не дорівнює заданому значенню n, то це означає, що досягнуто кінця файлу або зафіксовано помилку читання. Уточнити причину неповного зчитування блоку можна за допомогою функцій feof () та ferror (), які опишемо далі.

Використання функції fread () проілюструємо прикладом програми, яка визначає середньоарифметичне значення набору дійсних чисел, бінарні коди яких зберігаються у файлі attempj.dat, зареєстрованому в каталозі C:\EXPRDATA. Дані з файлу зчитуються в буфер блоками по N чисел. Процес роботи з файлом завершується, коли розмір зчитаного блоку менший за N, що сигналізує про досягнення кінця файлу.

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

/* Визначення середньоарифметичного значення послідовності */

/* дійсних чисел, що зберігається у заданому бінарному файлі */

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

#include <stdio.h>

#define N 1000 /* розмір блоку даних */

double buf[N];

int main (void)

{

FILE *fd;

char fname[]="C:\\EXPRDATA\\attempj.dat";

double sum;

unsigned n, k, i;

if ( (fd=f open (fname, "rb") )== NULL) /* бінарний режим обміну */

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

return 0;

}

sum=0; k=0; /* сума і кількість введених з файлу чисел */

do {

n = fread(buf, sizeof(double), N, fd) ;

k+=n;

for (i = 0; i<n; i++)

sum+=buf[i]; /* сумування чисел введеного блоку */

} while (n == N);

printf("\n Середнє значення %u елементів файла %s => %.31f\n",

k, fname, sum/k);

fclose (f);

return 0; }

Запис блоку даних у потік виконує функція

size_t fwrite (void* buf, size_t size, size_t n, FILE* fp);

Параметри цієї функції такі ж, як і в функції fread(): buf - вказівник на ділянку оперативної пам'яті, звідки зчитуються дані; size - розмір одного даного; n - кількість даних, що мають бути записані у файл (потік); fp - вказівник потоку виведення.

Функції getw() та putw(). Бібліотека системи програмування Borland C додатково включає дві функції: getw () і putw (). Перша з них призначена для зчитування з бінарного файлу двобайтового двійкового коду цілого числа. Друга функція записує в файл, відкритий у бінарному режимі, внутрішній двійковий код заданого цілочислового значення. Ці функції оголошені в <stdio. h> наступним чином:

int getw (FILE* fp);

int putw (int numb, FILE* fp);

У разі успішного виконання обидві функції повертають значення зчитаного або відповідно записаного числа, а в разі виникнення помилки - макроконстанту EOF.

Подана нижче функція FindNumber () здійснює пошук заданого числа number у відкритому файлі, заповненому бінарними кодами цілих чисел. Пошук розпочинається з поточної позиції файлу. Функція повертає порядковий номер number або 0, якщо такого числа у файлі немає (припускаємо, що number не дорівнюватиме EOF).

Приклад:

/* Функція пошуку заданого цілого числа в бінарному файлі */

long FindNumber (FILE* fb, int number)

{ int rnum; long k = 0;

do {

rnum = getw(fb); k++; /* зчитування числа */

if (rnum == number)

return k; /* число знайдено */

} while (rnum !=EOF);

return 0; /* задане число відсутнє */

}

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