Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Пользователь


Сообщения: 79
Благодарности: 1

Профиль | Отправить PM | Цитировать


Vlad Drakula
Потому, что сессия не за горами, потому, что требуют на языке Си использовать списки, С++ нельзя использовать, шаблоны здесь не пойдут.
Задачу решил следующим образом, функция views() правильно отображает данные из списка.
Код: Выделить весь код
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#define TRUE 1
#define FALSE 0
#define FILE_DB "db1.dat"
struct expt{int expert;char sport[20];int mesto;};
struct record{expt sps; record *prior;record *next;};
void clr (char a[]);
void printmenu(void);
void views(void);
void save(char a[],record *begin);
void load(char a[],record *begin);
void clr (char a[]){
FILE *f;
if((f=fopen(a,"w"))==NULL)printf("\n Error !\nFile could not be create\\opened.\n Press any key...");
else printf(" \n Data base clear successfully!\n Press any key...");
getch();
fclose(f);
}
void printmenu(){
clrscr();
printf("|----------------------------------|\n| Menu:\t\t\t\t   |\n|------------\
----------------------|\n| 1 - Clear file data base \t   |\n| 2 - Input data\t\t   |\n| 3 - View db data\t\t\t   |\n| 4 - Form file \
expert questioning |\n| 5 - Form file best sportsmans    |\n| 0 - Exit\t\t\t   |\n|-------\
---------------------------|\n\n  Selection item: ");
}
void views(record *begin){
 				clrscr();
   			printf("\n Out spicok bd:\n");
            while(begin){
            printf("(expert%d---%s---mesto-%d\n",begin->sps.expert,begin->sps.sport,begin->sps.mesto);
            begin=begin->next;
            }
            getch();
}
void save(char a[],record *begin){
FILE *f;
if((f=fopen(a,"w"))==NULL){printf("File could not be opened\n Press any key...");
getch();return;}else{
	while(begin!=NULL){
   fprintf(f,"%d",begin->sps.expert);
   fprintf(f,"%s",begin->sps.sport);
   fprintf(f,"%d",begin->sps.mesto);
   begin=begin->next;
   }
   }
fclose(f);
}
void main (){
record  	*begin=NULL, /*Указатель начала списка*/
			*last=NULL,  /*Указатель на очередную запись*/
         *list;       /*Указатель на элементы списка*/
char c;
FILE *f;
if((f=fopen("db1.dat","a+"))==NULL){printf("File could not be opened\n Press any key...");
	getch();return;}else{
   while(fgetc(f)!=EOF){
   last=(struct record*)malloc(sizeof(struct record));
   if(last==NULL){printf("\n Error !\n No find memory\n Press any key...");getch();return;}
   fscanf(f,"%d",&last->sps.expert);
   fscanf(f,"%s",&last->sps.sport);
   fscanf(f,"%d",&last->sps.mesto);
   if(begin==NULL){last->prior=NULL;begin=last;last->next=NULL;}
   else{list=begin;
while(list){
                               	if(list->next==NULL){
                                 last->next=NULL;
                              	last->prior=list;
                              	list->next=last;
                              	break;
                                 }
                                list=list->next;
               }
               }
   }
   }
fclose(f);
while(1){printmenu();
scanf("%s",&c);
switch(c){
	case '1':{clr("db1.dat");break;}
   case '2':{
      		int b=TRUE,extemp,count,c;
            while(b!=FALSE){  //цикл ввода данных
            clrscr();
				printf("\n Input namber expert (1-10): ");
   			scanf("%d",&extemp);
            for(count=3;count>0;count--){
            last=(struct record*)malloc(sizeof(struct record));
           	if(last==NULL){printf("\n Error !\n No find memory\n Press any key...");getch();return;}  /*проверка, выделена ли память?*/
            (*last).sps.expert=extemp;
            (*last).sps.mesto=count;
            printf("\n Input family srortsmen: ");
   			scanf("%s",&(*last).sps.sport);
			   if(begin==NULL){last->prior=NULL;begin=last;last->next=NULL;} //списка ещё нет
            else{list=begin; /*cписок уже существует*/
                  while(list){ /*цикл просмотра списка-поиск места для новой записи*/
                  	if(list->next==NULL){ /*Включить запись в конец списка*/
                              last->next=NULL;
                              last->prior=list;
                              list->next=last;
                              break;       /*выход из списка просмотра цикла*/
            						}
                      list=list->next;
                  } 
                  }
          		} 
               			printf("\n Next input? 1 - Yes \\ 0 - No\n");  //ввод нового эксперта
            				scanf("%d",&b);
     		  } 
           printf("\n Data save? 1 - Yes \\ 0 - No\n");  /*записать данные в db.dat?*/
            scanf("%d",&c);
            if(c==TRUE)save(FILE_DB,begin);
            else ;
            break;}
   case '3':{views(begin);break;}
   case '4':break;
   case '0':return;
   default:{printf("\n Error !\n Can't no right selection item\n Press any key...");getch();break;}
}
}
}
Теперь возник новый вопрос. Данные записываются с помощью функции save(), в файл db1.dat.
При запуске программы, данные из файла db1.dat (конечно, если, они на этот момент существуют), должны
должны загружаться в оперативную память. Вот участок кода:
Код: Выделить весь код
FILE *f;
if((f=fopen("db1.dat","a+"))==NULL){printf("File could not be opened\n Press any key...");
	getch();return;}else{
   while(fgetc(f)!=EOF){
   last=(struct record*)malloc(sizeof(struct record));
   if(last==NULL){printf("\n Error !\n No find memory\n Press any key...");getch();return;}
   fscanf(f,"%d",&last->sps.expert);
   fscanf(f,"%s",&last->sps.sport);
   fscanf(f,"%d",&last->sps.mesto);
   if(begin==NULL){last->prior=NULL;begin=last;last->next=NULL;}
   else{list=begin;
while(list){
                               	if(list->next==NULL){
                                 last->next=NULL;
                              	last->prior=list;
                              	list->next=last;
                              	break;
                                 }
                                list=list->next;
               }
               }
   }
   }
fclose(f);
Но просматривая функцией views(), вижу, что данные отображаются неверно. Значит, я их неверно извлекаю из файла.
В чём заключается ошибка? Как это реализовать?

Отправлено: 13:49, 02-05-2006 | #3