Написала программу для работы с просматриваемой таблицей по запросам оператора. И таблица, и информация, относящаяся к элементу таблицы, хранятся в основной памяти. Код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int busy;
char key[8];
char *info;
}Item;
Item* Table(int SIZE)
{
int i;
Item *mass=(Item*)malloc(SIZE*sizeof(Item));
for(i=0; i<SIZE; i++)
mass[i].busy=0;
return mass;
}
void newelt(char key[8], char *info, Item *mass, int SIZE)
{
int n=-1,i;
for (i=0; i<SIZE; i++)
{
if (mass[i].busy==0) n=i;
if (strcmp(mass[i].key,key)==0)
{
printf("Error: key is not unique\n");
break;
}
}
if (n==-1) printf("Error: incorrect number of elements\n");
else
{
strncpy(mass[n].key,key,8);
mass[n].info=info;
mass[n].busy=1;
}
}
void del(char key1[8], char key2[8], Item *mass, int SIZE)//удаляемый диапазон в лексико-графическом порядке
{
int n=0,i;
for (i=0; i<SIZE; i++)
{
if ((strcmp(key1,mass[i].key)>=0)&&(strcmp(key2,mass[i].key)<=0))
{
mass[i].busy=0;
n=n++;
free(mass[i].info);
}
}
printf("%i elements are deleted\n",n);
}
void find(char key1[8], char key2[8], Item *mass, Item *mass1,int SIZE)
{
int n=0,i;
mass1=Table(SIZE);
for (i=0; i<SIZE; i++)
{
if ((strcmp(key1,mass[i].key)>=0)&&(strcmp(key2,mass[i].key)<=0)&&(mass[i].busy==1)) //key1 - верхняя граница.
{
newelt(mass[i].key,mass[i].info,mass1,SIZE);
n=n++;
}
}
printf("%i elements are founded\n",n);
prt(mass1, SIZE);
}
char *entKey()
{
char *a=(char*)malloc(1000*(sizeof(char)));
char key[8];
int f=1;
do
{
printf("enter key\n");
scanf("%s",a);
if (strlen(a)!=8)
{
printf("error: illegal key\n");
f=0;
}
}
while(f==0);
strncpy(key,a,8);
free(a);
return key;
}
char* schit()//возвращение указателя на строку, размер которой заранее неизвестен (считывание вводимой строки)
{
int i=1;//кол-во симвролов, на которое выделена память вне цикла
char *a;//задаем указатель на ячейку памяти, где лежат данные типа char
a=(char*)malloc(sizeof(char));//выделение памяти на один символ
/*a=0;*/
do
{
i=strlen(a);
a=(char*)realloc(a,strlen(a)+1);//довыделение памяти
*(a+i)=getch();//считывание символа,смещенного на i ячеек относительно начала
*(a+i+1)=0;//конец строки, либо присваивание значения следующей ячейки
}
while (*(a+i)!=13);//13 - код enter'а (считывание до тех пор, пока не нажмем enter)
a[i]=0;//конец строки
return a;//возвращение адреса строки (а - указатель)
}
char *entInfo()
{
char *a=schit();
printf("enter info: \n");
scanf("%s",a);
return a;
}
int prt(Item *mass, int SIZE)
{
int i;
for(i=0; i<SIZE; i++)
{
if (mass[i].busy==1)
printf("%s %s\n",mass[i].key,mass[i].info);
}
}
int main()
{
char key[8], key1[8], key2[8], *info;
char* a=(char*)malloc(1000*sizeof(char));
const int SIZE = 5;
Item *mass=Table(SIZE);
Item *mass1=Table(SIZE);
do
{
printf("Choose operation:\n 1. Add new element\n 2. Delete element\n 3. Find element\n 4. Print the table\n 5. Exit\n");
scanf("%s",a);
if (strlen(a)>1)
{
printf("Error: incorrect operation\n");
continue;
}
switch(a[0])
{
case '1':
strncpy(key,entKey(),8);
info=entInfo();
newelt(key, info, mass, SIZE);
break;
case '2':
strncpy(key1,entKey(),8);
strncpy(key2,entKey(),8);
del(key1, key2, mass, SIZE);
break;
case '3':
strncpy(key1,entKey(),8);
strncpy(key2,entKey(),8);
find(key1, key2, mass,mass1, SIZE);
break;
case '4':
prt(mass, SIZE);
break;
case '5':
break;
default:
printf("Error: incorrect operation\n");
continue;
}
}
while (a[0]!='5');
return 0;
}
Вопрос в следующем. Нужно переделать программу так, чтобы и таблица, и информация, относящаяся к элементу таблицы, хранились во внешней памяти (используется двоичный файл). При этом имя файла вводится по запросу из программы.
Если кто сталкивался, подскажите, пожалуйста, как это сделать.