Міністерство освіти та науки України
НУ “Львівська політехніка”
Лабораторна робота №10
“Опрацювання файлів з двійковими даними”
Львів 2005
Назва роботи: Опрацювання файлів з двійковими даними.
Мета роботи: Закріпити теоретичні знання та оволодіти практичними навиками в створенні програм для опрацювання даних, що міститься в дискових файлах. Засвоїти основні методи читання, запису даних з дискових файлів бінарного типу.
Завдання на лабораторну роботу.
Розробити програмне забезпечення зі застосуванням техніки роботи з дисковими файлами відповідно до заданого варіанту.
Програмне забезпечення повинно складатися з декількох модулів. Основна програма вводить та виводить дані які опрацьовуються функціями, що реалізовані як окремі модулі.
Назву текстового файлу, в якому містяться дані для опрацювання, передавати через аргументи функції main().
Розміри та значення елементів матриць (в загальному не квадратних) вводити з текстового файлу. Параметри, що задають кількість рядків та стовпців повинні бути іменованими.
Пам’ять під матриці виділяти динамічно. Для трикутних матриць (опираючись на їх структуру) виділяти мінімальні об’єми пам’яті.
Обмін даними з функцією, що опрацьовує матрицю, виконувати через двійковий файл (тимчасовий). Назва файлу передається функції як параметр. Після використання тимчасовий файл знищувати.
Результати обчислень записувати в текстовий файл.
Назви файлів (тимчасового та для запису результатів) формувати на основі назви файлу з вхідними даними шляхом заміни розширення.
Звернути особливу увагу на обробку помилок, які користувач може зробити при створені текстового файлу з вхідними даними.
При вирішенні задач забезпечити дружній інтерфейс з користувачем.
Текст laba10.c:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <dir.h>
#include "laba10fn.h" //підключення власного заготовочного файлу
int main(int argc,char* argv[])
{
char file_in[20],file_out[20],drive[5],dir[10],name[10],ext[5];
int num,width,j,i;
int sum;
float ser;
FILE *f1,*f2,*tmp; //файлові потоки
int **masiv; //вказівка на двохвимірний масив
clrscr(); //очистка екрану
if(argc!=2) //перевірка кількості параметрів
{printf("Error in arguments");return 1;}
sscanf(argv[1],"%s",file_in); //зчитування імені файлу
fnsplit(file_in,drive,dir,name,ext); //розбивання імені на складові
fnmerge(file_out,drive,dir,name,"out"); //зміна розширення імені файлу
if(!(f1=fopen(file_in,"r"))) //відкриття файлу для читання
{printf("Error: cannot open input file");return 1;}
if(!(f2=fopen(file_out,"w"))) //відкриття файлу для запису
{printf("Error: cannot create output file");return 1;}
tmp=tmpfile();
if(!(tmp=tmpfile())){printf("Error: cannot create output file");return 1;}
//перевірка чи файл пустий
if(feof(f1)){printf("Error: input file is empty");return 1;}
if(!(fscanf(f1,"%d",&width))){printf("Error: not number in input file");return 1;}
for(i=1,num=0;i<width+1;num+=i++);
masiv=(int **)calloc(width,sizeof(int*));//виділення памяті під масив
for(i=0;i<width;i++)
masiv[i]=(int*)calloc(i+1,sizeof(int));
//зчитування вхідних даних з файлу
for(i=0;i<width;i++)
for(j=0;j<i+1;j++)
{
if(feof(f1)){printf("Error: input file is not complete");return 1;}
if(!fscanf(f1,"%d",&masiv[i][j])){printf("Error: not number in input file");return 1;}
}
for(i=0;i<width;i++)
fwrite(&masiv[i][0],sizeof(int),i+1,tmp);
//підрахунок суми та середнього арифметичного всіх елементів
fseek(tmp,0,0);
sum=sum_el(tmp);
fseek(tmp,0,0);
ser=ser_el(tmp);
//вивід результатів
fprintf(f2,"Summary of elements: %d\n",sum);
fprintf(f2,"Seredne arifmet of elements: %.4f\n",ser);
//закриття файлів
fclose(tmp);
fclose(f1);
fclose(f2);
free(masiv);
return 0;
}
Текст laba10fn.h
//прототипи функцій
#include <stdio.h>
int sum_el(FILE *tmp);
float ser_el(FILE *tmp);
Текст laba10fn.c:
#include "laba10fn.h"
int sum_el(FILE *tmp)
{
int sum=0;
int cur;
while(!feof(tmp))
{
fread(&cur,sizeof(int),1,tmp);
sum+=cur;
}
sum-=cur;
return sum;
}
float ser_el(FILE *tmp)
{
int sum=0,num=0;
int cur;
while(!feof(tmp))
{
fread(&cur,sizeof(int),1,tmp);
sum+=cur;
num++;
}
sum-=cur;
num--;
return (float)(sum)/num;
}
Результат роботи програми:
Вхідний файл:
4
1
2 3
4 5 6
7 8 9 10
Вихідний файл:
Summa= 551
Seredn= 5.5000
Алгоритм програми
Висновок: Ознайомились з масивами та основними прийомами створення та опрацювання динамічних масивів. Організували зчитування вхідної інформації з текстового файлу та обмін через двійковий файл.