Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Запись в файл(лекция).doc
Скачиваний:
6
Добавлен:
11.02.2016
Размер:
532.99 Кб
Скачать

Використання функцій fread() та fwrite()

Для зчитування та запису даних, розмір типу яких перевищує 1 байт, файлова система мови С містить дві функції: fread()та fwrite(). Вони використовуються коли файл був відкрито в бінарному (двійковому) режимі. Ці функції дозволяють зчитувати та записувати блоки даних будь-якого типу. Їх прототипи мають наступний вигляд:

size_t fread (void *буфер, size_t кіл_ть_байтів, size_t кіл_ть_блоків, FILE *fp)

size_t fwrite(const void *буфер, size_t кіл_ть_б, size_t кіл_ть _блоків, FILE *fp)

У прототипі функції fwrite() параметр буфер являє собою покажчик на область пам'яті де містяться дані, що повинні бути записані у файл. Значення параметру кількість блоків (кіл_ть _блоків) визначає кількість блоків що підлягає зчитуванню або запису. Довжина блоків задається параметром кількість байтів. (Нагадаємо, що тип size_t визначений як ціле число без знака. ) Вказівник fp є вказівником на раніше відкритий потік.

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

Приклад ілюструє спочатку запис трьох змінних типів double, int та long у файл відкритий в бінарному режимі, а потім зчитує та виводить на екран числа. Необхідно звернути увагу на функцію sizeof, що забезпечує визначення кожного типу даних.

#include <stdio.h>

#include <stdlib.h>

int main()

{

FILE *fp;

double d = 12.23;

int i = 101;

long l = 123023L;

if((fp=fopen("test", "w+b"))==NULL)

{

printf("Відбулась помилка! \n");

exit(1);

}

// якщо виникне помилка дамо повідомлення на екран

fwrite(&d, sizeof(double), 1, fp);

fwrite(&i, sizeof(int), 1, fp);

fwrite(&l, sizeof(long), 1, fp);

// записуємо d, i, l

rewind(fp);

//переводимо курсор на початок файлу

fread(&d, sizeof(double), 1, fp);

fread(&i, sizeof(int), 1, fp);

fread(&l, sizeof(long), 1, fp);

// зчитуємо в тій послідовності, що й записали

printf("double=%5.4f int=%d long=%ld", d,i,l);

//друкуємо d, i, l

fclose(fp);

return 0;

}

Приклад ілюструє запис структури, що складається з двох полів.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <iostream>

using namespace std;

int main(void)

{

FILE *f;

int i=0, j, t, n, pp;

const int l=20;

char sf[40];

struct STUDENT

{

char Name[l];

int Year;

};

STUDENT stud;

printf("Введіть ім’я файлу: ");

gets(sf);

f=fopen(sf, " wb+");

if(f != NULL)

{

//відкриває для запису бінарний потік

s11:

strcpy(stud.Name,"");

stud.Year=0;

pp=1;

//systen("clrscr");

i++;

printf("Введіть запис [%d]: \n", i);

printf("ПІБ студента -> ");

do

{

gets(stud.Name);

t=strlen(stud.Name);

}

while (t==0);

//конструкція дозволяє забезпечити введення прізвища студента

for (j = t; j < l-2; j++)

strcat(stud.Name," ");

//додаємо додаткові пробіли, щоб мати однакову довжини = l

printf("Введіть дату народження-> ");

cin >> stud.Year;

//введення дати народження

fwrite(&stud, sizeof(struct STUDENT), 1, f);

// записуємо запис у файл

s12:

printf("Для продовження натисніть -> Enter, для виходу -> Esc \n",n);

while (!kbhit());

// очікування натискання клавіші

if ((pp=getch())!=27)

if (pp==13)

goto s11;

else

goto s12;

//зчитування та перевірна натиснутих клавіш за кодом натиснутої клавіші, Enter – 13 / Esc – 27

}

fclose(f);

return 0;

}

Приклад ілюструє зчитування записів, що записані за допомогою попередньої прикладу.

#include <stdio.h>

using namespace std;

int main(void)

{

FILE *f;

int i;

const int l=20;

char sf[40];

struct STUDENT

{

char Name[l];

int Year;

};

STUDENT stud;

printf("Введіть ім’я файлу: ");

gets(sf);

f=fopen(sf, " rb+");

if(f != NULL)

{

//відкриття файлу в режимі зчитування

fseek(f,0,SEEK_END);

//переводимо курсор в кінець файлу

int d = (int)(ftell(f)/sizeof(struct STUDENT));

//визначає кількість записів за формулою (кількість записаного)/(розмір структури одного запису)

fseek(f,0,SEEK_SET);

//переведення курсору на початок файлу

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

{

fread(&stud, sizeof(struct STUDENT), 1, f);

printf("Запис [%d] : %s %d \n",1+i,stud.Name, stud.Year);

}

rewind(f);

//переведення курсору на початок файлу

i=0;

while (!feof(f))

{

i++;

printf("\nПозиція курсору = %ld\n ", ftell(f));

fread(&stud, sizeof(struct STUDENT), 1, f);

printf("Запис [%d] : %s %d \n",i,stud.Name, stud.Year);

}

}

fclose(f);

return 0;

}

Результат:

Запис [0] : Пузій П.П. 1979

Запис [1] : Петренко П.А. 1980

Позиція курсору = 0

Запис [1] : Пузій П.П. 1979

Позиція курсору = 24

Запис [2] : Петренко П.А. 1980

Позиція курсору = 48

Запис [3] : Петренко П.А. 1980

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