Лабораторна робота
Тема: Файли
Мета
Навчитись працювати з файлами.
Теоретичні відомості
Файлом називається будь-яка 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-коди).
Завдання №8
Сформувати файл “В”, записами якого є: прізвища письменників, ініціали, назви книги, рік видання. Використовуючи ці данні, сформувати файл “Е”, де розмістити прізвища письменників, які видають більше двох книг за рік.
Програма
#include<stdio.h>
#include<string.h>
#define size 255
main()
{
int rik,i,k;
char priz[size],naz[size],mov[size];
FILE *f,*f1;
clrscr();
if( (f=fopen("B","w") )==NULL)
{
printf("file no open\n");
exit(1);
}
for(i=0;i<2;i++)
{
*priz='\0';
printf("prizvu64e>");
scanf("%s",&priz);
*naz='\0';
printf("nazva knugu>");
scanf("%s",&naz);
rik=0;
printf("rik vud-va>");
scanf("%i",&rik);
*mov='\0';
printf("prizvuw4e>");
scanf("%s",&mov);
fprintf(f, "%s\n%s\n%i\n%s\n",priz,naz,rik,mov);
}
fclose(f);
clrscr();
f=fopen("B","r");
while(!feof(f))
{
*priz='\0';
*naz='\0';
*mov='\0';
fscanf(f,"%s\n%s\n%i\n%s\n",priz,naz,rik,imya);
printf("%s\t%s\t%i\t%s\n", priz,naz,rik,imya);
}
rewind(f);
printf("KNUHU\n");
f1=fopen("BI","w");
k=0;
while(!feof(f))
{
*priz='\0';
*naz='\0';
*mov='\0';
fscanf(f,"%s\n%s\n%i\n%s\n",priz,naz,imya);
if(rik>1990 && (!strcmp(naz,"prosvita")))
fprintf(f1,"%s\n%s\n%i\n%s\n", priz,naz,rik,imya);
if((!strcmp(mov,"basic")))
k++;
}
fclose(f);
fclose(f1);
f1=fopen("BI","r");
while(!feof(f1))
{
*priz='\0';
*naz='\0';
*mov='\0';
fscanf(f1,"%s\n%s\n%i\n%s\n", priz,naz,rik,imya);
printf("%s\t%s\t%i\t%s\t%i\n", priz,naz,rik,imya);
}
rewind(f1);
fclose(f1);
printf("\a bilwe 2 knug na rik: \t%i\n",k);
}