Лабораторна робота
Тема:
Файли.
Послідовний доступ.
Мета роботи: вивчення засобiв мови Сi для обробки файлiв за допомгою послідовного доступу.
Завдання 1: Сформувати файл, що містить інформацію про книги за таким зразком: прізвище автора, назва, рік видання. Використовуючи сформований файл, знайти назви книг даного автора, рік видання. Прізвище автора ввести з клавіатури.
Короткі теоретичні відомості:
Файлом називаїться будь-яка iнформацiя, записана в зовнiшню
(магнiтну) пам'ять. Обмiн даними мiж оперативною та магнiтною пам'яттю вiдбуваїться через спецiально вiдведену для цього частину оперативноє пам'ятi, яка називаїться буферною.
При використаннi файлiв обов'язковими атрибутами програми є:
оголошення, функцiє вiдкриття та закриття файлу, а також функцiє
вводу-виводу. Оголошення файлiв виконуїться так:
FILE *f1,*f2,...,*fn;
Тут *f1,...,*fn -вказувачi на файли, одночасно можна оголосити n
файлiв. Кожному файлу вiдповiдаї свiй вказувач, ця вiдповiднiсть
встановлюїться в момент вiдкриття файлiв.
Нижче приведенi основнi функцiє для роботи з файлами.
f1=FOPEN("iф","тип"); - вiдкриття файлу з iменем iф, призна-
чення йому вказувача f1. Iм'я файлу складаїться з назви та розши-
рення, роздiлених крапкою. Назва може мати до 8-ми лiтер. Розши-
рення маї довжину до трьох букв i в файлах, утворених користува-
чем, необов'язкове. Для задання типу служать символи: r - зчиту-
вання з файлу, w - запис у файл, a - доточування файлу. Функцiя
повертаї значення NULL, якщо при вiдкриттi сталася помилка.
FCLOSE(f1,...,fn); - закриття файлiв. В момент закриття вiд-
буваїться запис у файл залишку буферноє пам'ятi, якщо вiн був
вiдкритий для запису.
FSEEK(f1,n,k); - прямий доступ до файлу, встановлення вказува-
ча файлу, на який вказуї f1. При вводi-виводi контролюїться поточний номер байта, який саме вводиться чи виводиться, вказувачем файлу (лiчильником номера байта в файлi, не путати з вказувачем на файл). Параметр n визначаї на скiльки байтiв слiд змiстити цей вказувач. Параметр k задаї початкову позицiю, вiд якоє потрiбно перемiстити вказувач, вiн може приймати значення:
0 - вiд початку файлу, 1 - вiд поточноє позицiє, 2 - вiд кiнця файлу.
a=FGETC(f1); - читання одного символа з файлу, на який вказуї
f1, присвоїння його значення змiннiй a типу int або char.
FPUTC(a,f1); - запис у файл iз вказувачем f1 одного символа.
FGETS(*s,size,f1); - читання з файлу, на який вказуї f1, рядка
символiв довжиною size байт, який закiнчуїться нулем ('\0'), по-
мiщення цього рядка в оперативну пам'ять, починаючи з адреси s
типу char.
FPUTS(*s,f1); - занесення в файл iз вказувачем f1 лiтерного
рядка, який закiнчуїться нулем i який знаходиться в оперативнiй
пам'ятi, починаючи з адреси s типу char.
FREAD(*r,size,N,f1); - читання з файлу, на який вказуї f1, N
записiв - рядкiв фiксованоє довжини, кожний з яких займаї size
байт, i занесення єх в оперативну пам'ять, починаючи з адреси r.
Записи в файлi повиннi закiнчуватися символом повернення каретки, кiнець рядка, тощо.
FWRITE(*r,size,N,f1); - занесення записiв у файл.
FSCANF(f1,"сф",саз); - форматоване введення, читання з файлу,
який маї вказувач f1, даних, перетворення єх типiв вiдповiдно до
списку форматiв сф i занесення в оперативну пам'ять, задану спис-
ком адрес змiнних саз.
FPRINTF(f1,"сф",сiз); - форматоване виведення, занесення в
файл змiнних, заданих списком сiз.
Всi функцiє читання файлу повертають значення EOF або NULL,
якщо був досягнений кiнець файлу.
Один i той самий файл, створений засобами мови Сi, може бути
використаний для вводу-виводу посимвольно, у виглядi лiтерних
рядкiв змiнноє або фiксованоє (записiв) довжини та форматованих даних. При форматованому вводi-виводi та вводi-виводi записiв
вiдбуваїться перетворення числових даних у лiтернi i навпаки.
Незалежно вiд типiв даних, занесених у файл засобами мови Сi, на магнiтний диск записуються данi лiтерного типу (ASCII-коди).
Програма:
# include <stdio.h>
# include <stdlib.h>
# include <bios.h>
int i;char in[4][40];
/************************************************************/
/* Головна програма */
/************************************************************/
main()
{
clrscr();
CREATE_FILE();
P_4_FILE();
R_4_FILE();
POSHYK();
}
/************************************************************/
/* Функцiя створення файлу */
/************************************************************/
CREATE_FILE()
{
FILE *ff;
char info[4][40]={"Dybovuc V.P. Vushcha matematuka.2004",
"Levchyk L.T. Estetuka. 2006",
"Tumchenko A.A. SAPR. 2000",
"Shushkin V.O. MOSP. 2005"};
if((ff=fopen("abc","w"))==NULL)
{printf("\nПомилка при вiдкриваннi файлу \n");exit(1);}
for(i=0;i<4;i++) fprintf(ff,"%s\n",info[i]);
if(fclose(ff)!=NULL)puts("Помилка при закриттi файлу");
}
/************************************************************/
/* Функцiя посимвольного читання файлу */
/************************************************************/
P_4_FILE()
{
FILE *ff;
char x;
if((ff=fopen("abc","r"))==NULL)
{printf("\nПомилка при вiдкриваннi файлу \n");exit(1);}
printf("Посимвольне читання файлу:\n\n");
while((x=fgetc(ff))!=EOF)printf("%c",x);
if(fclose(ff)!=NULL)puts("Помилка при закриттi файлу");
}
/************************************************************/
/* Читання рядкiв змiнної */
/************************************************************/
R_4_FILE()
{
FILE *ff;
if((ff=fopen("abc","r"))==NULL)
{printf("\nПомилка при вiдкриваннi файлу \n");exit(1);}
printf("\nЧитання рядкiв змiнної довжини:\n\n");
for(i=0;i<4;i++)
{
fgets(in[i],sizeof(in[i]),ff);
printf("%s",in[i]);
}
if(fclose(ff)!=NULL)puts("Помилка при закриттi файлу");
}
/************************************************************/
/* Функцiя пошуку */
/************************************************************/
POSHYK()
{
char z;
printf("\nЩоб перейти до пошуку - нажмiть ENTER");
getch();v:clrscr();
printf("\nВведiть перщу букву прiзвища автора(або '0' щоб вийти):\n");
scanf("%c",&z);
if(z=='0')exit(1);
for(i=0;i<4;i++)
if(in[i][0]==z)printf("Результати пошуку:\n%s",in[i]);
printf("Нажмiть ENTER");
getch();goto v;
}
Таблиця ідентифікаторів:
Ідентифікатор |
Змінна
info[i][j] |
Масив рядків (для запису в файл )
in[i][j]; |
Масив рядків (для читання з файлу)
x | Змінна для посимвольного читання
z | Змінна для порівняння (функція пошуку)
i,j | Параметри циклу
Результати:
Посимвольне читання файлу:
Dybovuc V.P. Vushcha matematuka.2004
Levchyk L.T. Estetuka. 2006
Tumchenko A.A. SAPR. 2000
Shushkin V.O. MOSP. 2005
Читання рядкiв змiнної довжини:
Dybovuc V.P. Vushcha matematuka.2004
Levchyk L.T. Estetuka. 2006
Tumchenko A.A. SAPR. 2000
Shushkin V.O. MOSP. 2005
Щоб перейти до пошуку - нажмiть ENTER
/*Після нажимання клавіші ENTER */
Введiть перщу букву прiзвища автора(або '0' щоб вийти):
T
Результати пошуку:
Tumchenko A.A. SAPR. 2000
Нажмiть ENTER
/*Після нажимання клавіші ENTER */
Введiть перщу букву прiзвища автора(або '0' щоб вийти):
L
Результати пошуку:
Levchyk L.T. Estetuka. 2006
Нажмiть ENTER
/*Після нажимання клавіші ENTER */
Введiть перщу букву прiзвища автора(або '0' щоб вийти):
0
Висновок: Я вивчив засоби мови Сi для обробки файлiв за допомгою послідовного доступу.