Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2009, 12:18   #1
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию Считывание и запись структур в бинарный файл

Делаю автоподгрузку и автосохранение структуры из бинарного файла, подскажите пожалуйста, почему записывается n количество раз значение первой записи в моем списке, если n количество записей в списке. Не как не могу понять, что с этим сделать. Поидее проблема в том, что не обновляется ссылка. Но как её обновить помимо как temp=temp->forward; не придумаю.

Код:
void save(myList* &FIRST,myList* &LAST)
{  workList z;
   myList *temp;
   temp=FIRST;
   ofstream save_file("d:\\base.dat",ios::binary, ios::out) ;
   if(save_file)
	 {
	  while(temp!=LAST)
	   {			
			  save_file.write((char *) &temp->data, sizeof(workList));
			  temp=temp->forward;
	   }
	 }
   else
	  {
	   errormessage("Cannot save to type file");
	   return;
	  }
save_file.close();
}


void load(void)
{ workList z;
   ifstream load_file("d:\\base.dat",ios::binary);
   if (load_file)
	 {
		while(!load_file.eof())
		  {
			 load_file.read((char *) &z, sizeof(workList));
			 ADD(z,FIRST,LAST);
		  }
	 }
   else
	{
	   errormessage("Can't load file from Type file");
	   return;
	}
  load_file.close();
}
TheKnyazz вне форума Ответить с цитированием
Старый 10.11.2009, 12:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты уверен что список верно наполняется?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2009, 12:54   #3
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

ну да...то есть вот,
Код:
void ADD(const workList &z,myList* &FIRST,myList* &LAST)
{  myList *temp=new myList;
   temp->data=z;
	   if(FIRST){
				 temp->back=LAST;
				 temp->forward=0;
				 LAST->forward=temp;
				 LAST=temp;
				}
		  else {
				 temp->back=0;
				 temp->forward=0;
				 FIRST=LAST=temp;
			   }
}
TheKnyazz вне форума Ответить с цитированием
Старый 10.11.2009, 13:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ок. т.е. в файл все пишется верно?
А можно помацать весь твой код?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2009, 13:21   #5
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

это немного проблематично,
Код:
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <fstream.h>
#include <iostream.h>
struct workList{ int tabNum;
				 char Fio[23];
				 int age;
				 char gender[1];
				 char prof[10];
				 int work_age;
				 int work_level;
				 int num_ceh;
				 int num_sector;
				 int summery;
				};

struct myList{  workList data;
				myList *back;
				myList *forward;
				};

typedef struct myList *listPtr;
workList myWorkList;
char bufRus[256];
myList *FIRST=0,
	   *TEMP=0,
	   *LAST=0;

unsigned item;                 //nomer punkta menu
unsigned prev;                 //nomer predidujego punkta menu
int key;                       //kod klavishi
unsigned int defaultmode,      //tekujiy rejim ekrana
		 activecolor,      //cvet aktivnogo punkta menu
		 inactivecolor;    //cvet neaktivnogo punkta menu


void initmenu(unsigned int activecolor, unsigned int inactivecolor);   //inicializaciya menu
void drawitem(unsigned int item, unsigned int color); 

workList input(myList *list);
void view(myList* &first,myList* &temp);
myList *addToList_1(const workList &l);
myList *addToList(const workList &l, myList* &last);
void ADD(const workList &z,myList* &FIRST,myList* &LAST);
void save(myList* &FIRST,myList* &LAST);
void load(void);int errormessage(char *str);

int _tmain(int argc, _TCHAR* argv[])
{
 load();
 defaultmode=LASTMODE;                //zapomnit tekujiy tekstoviy rejim okna
 textmode(C80);                       //ustanovit rejim 80*25 cvetnoy
 clrscr();
 activecolor=YELLOW;                   //cvet aktivnogo punkta menu
 inactivecolor=WHITE;                 //cvet neaktivnogo punkta menu
 initmenu(activecolor,inactivecolor); //inicializaciya menu

	while(1)                             //beskone4niy cikl
	  {
	   key = getch();                     //c4itivanie klavishi
	   if (key==0) key=getch();
	   switch (key)                       //operator vibora
		{
		 case 13:                         //najan enter
		window(1,4,80,25);            //okno dlya otobrajeniya punktov
		textcolor(WHITE);             //cvet punktov menu
		textbackground(BLUE);
		switch(item)
		 {
		   case 0:
				  if(FIRST){
								LAST=addToList(input(LAST),LAST);
						   }
						   else {
							   FIRST=addToList_1(input(LAST));
							   LAST=FIRST;
						   }
				  break;

		   case 1:
				  view(FIRST,LAST);
				  break;

		   case 2:
				// poisk();
				  break;


		   case 3:
				  {
				   /*	window(30,11,60,18);
					textcolor(YELLOW);
					textbackground(CYAN);
					cprintf("ЙННННННННННННННННННННННННННННН»");
					cprintf("є        Sort by              є");
					cprintf("є        Surname              є");
					cprintf("є        Tab number           є");
					cprintf("є        Age                  є");
					cprintf("є        Sector               є");
					cprintf("ИНННННННННННННННННННННННННННННј");
					getch();
					getch();
					switch()*/
				  }
				  break;

		   case 4:
					{
					  cout<<Rus("Введите номер удаляемого элемента");
					  int k;
					  cin>>k;
					  del(k,FIRST,TEMP);
					}
				  break;

		   case 5:
	   //	      izmen();
				  break;

		   case 6:
	  //		 variant();
				  break;

		   case 7:
				  SaveTxtFile(FIRST);
				  break;
		   case 8:
				 readTxtFile(FIRST,LAST);
				  break;


		   default: {save(FIRST,LAST);exit(1);}
		 }
		 getch();
		 getch();
		 break;
		 case 75:                  //72UPAAROW 80 DOWNARROW
		  {
		   prev=item;
		   if (item==0) item=N_ITEMS-1;   //perehod po menu vlevo
		   else item--;
		   break;
		  }
		 case 77:
		  {
		   prev=item;
		   if (item==N_ITEMS-1) item=0;   //perehod po menu vpravo
		   else item++;
		   break;

		  }
		 break;
		 case 27: {save(FIRST,LAST);exit(1);}                //dlya vihoda Esc
		 break;
		}

	  window(1,1,80,25);                 //okno dlya otobrajeniya punktov menu
	  clear();                           //o4istka rabo4ego okna
	  drawitem(prev,inactivecolor);      //vivod predidujego punkta
	  drawitem(item,activecolor);        //vivod vibrannogo punkta menu

	  }


}
Я немного ошибся, оно именно в файл пишет неправильно, т.е куча клонов первого элемента.

И вот, а разве в С++ есть типизированные файлы? Это же вроде дельфишная примочка.
TheKnyazz вне форума Ответить с цитированием
Старый 10.11.2009, 13:24   #6
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

Код:

//------------------------+++++ The View Function+++++------------------------

void view(myList* &first,myList *&last)
{
   if(!first)
	 {
	   cout<<Rus("База пуста")<<endl;
	   getch();
	   exit;
	 }
	 else {
	printf("ЙННННЛНННННННННННННННННННННННЛННННЛНННЛНННННННННННЛННННЛННННЛННННЛННННЛНННННН»\n");
	printf("єtab є                       єBirtє   є	          єworkєworkєN   єN   є      є\n");
	printf("єnumbє       FIO             єDateєSEXєProfession єAge єlev єcehaєsec-єsummerє\n");
	printf("є    є                       є    є   є           є    є    є    єtoraєy     є\n");
	printf("МННННОНННННННННННННННННННННННОННННОНННОНННННННННННОННННОННННОННННОННННОНННННН№\n");
	 myList *temp=first;
	 while(temp)
		  {
		   printf("є%-4iє%-23sє%-4dє %c є%-11sє%-4dє%-4dє%-4dє%-4dє%-6dє\n",temp->data.tabNum,temp->data.Fio,temp->data.age,
				  temp->data.gender,temp->data.prof,temp->data.work_age,temp->data.work_level,temp->data.num_ceh,temp->data.num_sector,temp->data.summery);
		   temp=temp->forward;
		 }
	printf("ИННННКНННННННННННННННННННННННКННННКНННКНННННННННННКННННКННННКННННКННННКННННННј\n");
  }
}


//-----------------===+++++++Error messege++++====----------------------------
int errormessage(char *str){
//функция вывода сообщения об ошибке
window(30,11,61,15);
textbackground(BLUE);clrscr();
window(32,12,52,15);textbackground(BLACK);clrscr();
window(31,11,51,15);
textcolor(RED);
textbackground(WHITE);
cprintf("ЙННННННННННННННННННН»");
cprintf("є       ERROR       є");
cprintf("є%-19sє",str);
cprintf("ИНННННННННННННННННННј");
_setcursortype(_NOCURSOR);
getch();
_setcursortype(_NORMALCURSOR);
return 1;
}

char *path(){//функция прорисовки окна для ввода пути
window(31,12,61,15);
textbackground(BLACK);
clrscr();
window(30,11,60,15);
textcolor(YELLOW);
textbackground(CYAN);
cprintf("ЙННННННННННННННННННННННННННННН»");
cprintf("є  PATH:                      є");
cprintf("є                             є");
cprintf("ИНННННННННННННННННННННННННННННј");
return write(9);
}



//----inicializaciya menu---------

void initmenu(unsigned int activecolor, unsigned int inactivecolor)
{
 unsigned int item;                   //nomer punkta menu
 _setcursortype(_NOCURSOR);
 window(1,1,80,3);                    //okno dlya vivida punktov
 textbackground(BLACK);               //cvet fona v one
 clrscr();                            //o4istka ekrana
 textcolor(inactivecolor);            //neaktivniy cvet vivod shapki tablici
 gotoxy(1,1);
 cputs("ЙННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»");
 gotoxy(1,2);
 cputs("є");
 drawitem(0,activecolor);             //aktivniy cvet
 for (item=1;item<N_ITEMS;item++)
	drawitem(item,inactivecolor);     //ostal'nie neaktivnie
 cputs("є");
 gotoxy(1,3);
 textcolor(inactivecolor);            //neaktivniy cvet vivod shapki tablici
 puts("ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");
 gotoxy(1,1);
}


//----------------------++++ Add new part of functions+++--------------------

void ADD(const workList &z,myList* &FIRST,myList* &LAST)
{  myList *temp=new myList;
   temp->data=z;
	   if(FIRST){
				 temp->back=LAST;
				 temp->forward=0;
				 LAST->forward=temp;
				 LAST=temp;
				}
		  else {
				 temp->back=0;
				 temp->forward=0;
				 FIRST=LAST=temp;
			   }
}

myList *addToList_1(const workList &l) //создание первого элемента списка
{
	myList *beg=new myList; //выделение памяти
	beg->data=l;           //перевод счит, введ данных в динамическую форму
	beg->back=0;            //обнуление ссылок на крайние элементы
	beg->forward=0;         //обнуление ссылок на крайние элементы
	return beg;             //возвращаем указатель на первый элемент
}

myList *addToList(const workList &l, myList* &temp) //создание элемента списка
{
   myList *curr=new myList;             //выделение памяти
   curr->data=l; 						//перевод счит, введ данных в динамическую форму
   curr->back=temp;					   //запоминаем указатель на пред элемент
   temp->forward=curr;					//указатель прошлого крайнего элемента на новый
   curr->forward=0;						//обнуление у нынешнего крайнего указателя на след элемент
   return curr;							//возвращаем указатель на новй элемент

}
//------vivod punktov menu----------

void drawitem(unsigned int item, unsigned int color)
{
  const d=8;
  const char *items[N_ITEMS]={" ADD ","  View  "," Search ","  Sort  "," Delete "," Edit "," Variant ","  Save","  Load " ,"  Exit "};
  const int pos[N_ITEMS]={2,d,2*d,3*d,4*d,5*d,6*d,7*d,8*d,9*d};
  window(1,1,80,3);                   //okno dlya otobrajeniya punkyov menu
  textbackground(BLACK);              //cvet fona v okne
  textcolor(color);                   //cvet bukv punkta
  gotoxy(pos[item],2);                //kursor v na4alo punktov
  cprintf("%s",items[item]);          //otobr.nazvanie punkta
}
TheKnyazz вне форума Ответить с цитированием
Старый 10.11.2009, 13:25   #7
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

Код:
workList input(myList *list)        //Функция ввода нового элемента с клавиатуры
{ workList l;
  int g;
  _setcursortype(_NORMALCURSOR);
  printf(Rus("Введите табельный номер   "));
  scanf("%d",&l.tabNum);
  printf(Rus("Введите фамилию   "));
  scanf("%s",l.Fio);
  printf(Rus("Введите год рождения   "));
  scanf("%d",&l.age);
  printf(Rus("Ваш пол?\n"));				// считывание данных
  //printf(Rus("1-Мужчина\n"));
  //printf(Rus("2-Женщина\n"));
	//  g=getch();
  //if (g=='1') l.gender="m";
  //else l.gender="f";
  scanf("%s",l.gender);
  printf(Rus("Профессия   "));
  scanf("%s",l.prof);
  printf(Rus("Стаж работы   "));
  scanf("%d",&l.work_age);
  printf(Rus("Разряд рабочего   "));
  scanf("%d",&l.work_level);
  printf(Rus("Номер цеха  "));
  scanf("%d",&l.num_ceh);
  printf(Rus("Номер участка   "));
  scanf("%d",&l.num_sector);
  printf(Rus("Заработная плата  "));
  scanf("%d",&l.summery);
  getch();
  return l;			 //возвращаем элемент структуры считанный с клавиатуры
}
char *Rus(const char *text)
	{
		CharToOem(text,bufRus);
		return bufRus;
	}
load и save есть.
TheKnyazz вне форума Ответить с цитированием
Старый 10.11.2009, 13:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
оно именно в файл пишет неправильно
А ты на экран выводи, а не в файл пиши. И в отладчике проверь правильно ли у тебя всетки список наполняется.
Может (например) forward указывает на FIRST во всех итемах?
Или данные одни и те же.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись классов в бинарный файл Feannewedd Общие вопросы C/C++ 6 29.06.2009 10:11
Бинарный файл mchip Microsoft Office Excel 10 05.03.2009 19:10
Бинарный файл Bayazet Общие вопросы Delphi 1 04.03.2009 16:39
Ещё запись в файл + считывание s-t-r-i-k-e-r Помощь студентам 3 03.06.2008 20:57
CreateFile - считывание дискеты в файл и обратная запись на нее... kalexi Win Api 1 01.10.2007 19:56