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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2014, 16:46   #1
F1nt
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 41
По умолчанию Удаление из файла

Новые записи сохраняются в файле нормально, а вот как удалить определённую запись не могу понять. Подскажите, если можно то в самой функции del. Это задача на тему хеш. Сам файл например такого содержания (таб номер, фамилия и оклад)
6256 Mihin 4560
4322 Muhin 4500
7756 Kuzin 1900
4622 Komarov 9000
3322 kyznec 4000
Код:
#include <stdlib.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#define N 103
 
struct info
    {
     int tab;
     char fam[20];
     float oklad;
     info()
     {
      tab=0; oklad=0;
     }
    }; info T[N];
 
int hesh(int key){ return key % N;}
void forms(char fl[]);//formiruet hesh tabl T iz faila fl
void output();//vivod mas T na ekran
int search(int p);//funkc vozvrash index zapisi s tab nomerom=p ili -1
void add (info g);//dobavl zapic g v tabl T
void del (info g);//udalenie
 
void main()
    {
     int z,k,s;
     info m,n;
     clrscr();
     forms("1.txt");
     cout<<endl;
     output();
     cout<<"Vvedidet tab fam oklad novogo sotr:"<<endl;
     cout<<"Tab nom:";
     while (cin>>m.tab)
        {
         cout<<"Familiya:"; cin>>m.fam;
         cout<<"Oklad:"; cin>>m.oklad;
         int i=search(m.tab);
         if (i!=-1)
            {
             cout<<"3anogo"<<endl;
             T[i]=m;
            }
            else {add(m); break;}
        }
     ofstream f("1.txt",ios::app);
     f<<m.tab<<'\t'<<m.fam<<'\t'<<'\t'<<m.oklad<<endl;
     output();
     for (int i=0; i<3; i++)
         {
          cout<<"\n\nVvedite tab nom poiska:";
          cin>>z;
          k=search(z);
          if (k==-1) cout<<"Ne naiden"; else
            cout<<T[k].tab<<'\t'<<T[k].fam<<'\t'<<T[k].oklad<<'\n';
         }
     cout<<endl<<"Vvedidet tab nomer del:"<<endl;
     cin>>n.tab;
     del(n);
     output();
     getch();
    }
/////////////////////////////////////////////////////////////////////////////
void add (info g)
    {
     int j=0;
     int i=hesh(g.tab);
     while (T[i].tab!=0 && j<N)
        {
         i=hesh(i+1);
         j++;
        }
     if (j==N){ cout<<"Tabl perepolnena";getch(); exit (0);}
        else T[i]=g;
    }
/////////////////////////////////////////////////////////////////////////////
void forms(char fl[])
    {
     ifstream F(fl);
     info x;
     while (F>>x.tab>>x.fam>>x.oklad)
     add(x);
    }
/////////////////////////////////////////////////////////////////////////////
void output()
      {
       cout<<"index tab fam oklad   "<<endl;
       for (int i=0; i<N; i++)
        if (T[i].tab!=0)
            cout<<i<<'\t'<<T[i].tab<<'\t'<<T[i].fam<<'\t'<<T[i].oklad<<'\n';
      }
/////////////////////////////////////////////////////////////////////////////
int search (int p)
      {
       int j=0, i=hesh(p);
       while (j++<N && T[i].tab)
        {
         if (T[i].tab==p)
            return i;
         i=hesh(i+1);
        }
       return -1;
      }
/////////////////////////////////////////////////////////////////////////////
void del (info g)
      {
       int i=hesh(g.tab);
       if (search) T[i].tab=NULL;
      }
F1nt вне форума Ответить с цитированием
Старый 26.01.2014, 18:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я думаю самый простой способ это использовать методику баз данных:
Код:
struct info
    {
     bool Deleted;
     int tab;
     char fam[20];
     float oklad;
     info()
     {
      tab=0; oklad=0;
     }
    };
Если Deleted записи true - считать ее удаленной. Не выводить ни на экран ни в файл. Пропускать в любых циклах программы. Физически запись существовать будет, но по факту не будет участвовать в обработках.
Если захочешь переписать данные в файл, то в цикле ессно учитывай запись только если !Deleted.

Идея ясна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.01.2014, 19:18   #3
F1nt
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 41
По умолчанию

В BC++ 3.1 нет логич типов)) Сейчас думаю как переписать данные в файл.
F1nt вне форума Ответить с цитированием
Старый 26.01.2014, 19:21   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Нет? Странно. Используй тип int. 0 - false, не 0 - true.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.01.2014, 19:59   #5
F1nt
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 41
По умолчанию

Не получается уже... Помогите доделать если не трудно.
Пробую переписать
Код:
ofstream f("1.txt");
файл отчистился, это в главной функции, а какой массив записать туда и взять то нечего с главной функции.

Последний раз редактировалось F1nt; 26.01.2014 в 22:43.
F1nt вне форума Ответить с цитированием
Старый 27.01.2014, 20:30   #6
F1nt
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 41
По умолчанию

Вопрос решён, всем спасибо.
Код:
#include <stdlib.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#define N 103

struct info
	{
	 int tab;
	 char fam[20];
	 float oklad;
	 info()
	 {
	  tab=0; oklad=0;
	 }
	}; info T[N];

int hesh(int key){ return key % N;}
void forms(char fl[]);//formiruet hesh tabl T iz faila fl
void output();//vivod mas T na ekran
int search(int p);//funkc vozvrash index zapisi s tab nomerom=p ili -1
void add (info g);//dobavl zapic g v tabl T
void del (info g);//udalenie
void record();

void main()
	{
	 int z,k,s;
	 info m,n;
	 clrscr();
	 forms("1.txt");
	 cout<<endl;
	 output();
	 cout<<"Vvedidet tab fam oklad novogo sotr:"<<endl;
	 cout<<"Tab nom:";
	 while (cin>>m.tab)
		{
		 cout<<"Familiya:"; cin>>m.fam;
		 cout<<"Oklad:"; cin>>m.oklad;
		 int i=search(m.tab);
		 if (i!=-1)
			{
			 cout<<"3anogo"<<endl;
			 T[i]=m;
			}
			else {add(m); break;}
		}
	 output();
	 for (int i=0; i<3; i++)
		 {
		  cout<<"\n\nVvedite tab nom poiska:";
		  cin>>z;
		  k=search(z);
		  if (k==-1) cout<<"Ne naiden"; else
			cout<<T[k].tab<<'\t'<<T[k].fam<<'\t'<<T[k].oklad<<'\n';
		 }
	 cout<<endl<<"Vvedidet tab nomer del:"<<endl;
	 cin>>n.tab;
	 del(n);
	 record();
	 output();
	 getch();
	}
/////////////////////////////////////////////////////////////////////////////
void add (info g)
	{
	 int j=0;
	 int i=hesh(g.tab);
	 while (T[i].tab!=0 && j<N)
		{
		 i=hesh(i+1);
		 j++;
		}
	 if (j==N){ cout<<"Tabl perepolnena";getch(); exit (0);}
		else T[i]=g;
	}
/////////////////////////////////////////////////////////////////////////////
void forms(char fl[])
	{
	 ifstream F(fl);
	 info x;
	 while (F>>x.tab>>x.fam>>x.oklad)
	 add(x);
	}
/////////////////////////////////////////////////////////////////////////////
void output()
      {
       cout<<"index	tab	fam	oklad	"<<endl;
       for (int i=0; i<N; i++)
		if (T[i].tab!=0)
			cout<<i<<'\t'<<T[i].tab<<'\t'<<T[i].fam<<'\t'<<T[i].oklad<<'\n';
      }
/////////////////////////////////////////////////////////////////////////////
int search (int p)
      {
       int j=0, i=hesh(p);
       while (j++<N && T[i].tab)
		{
		 if (T[i].tab==p)
			return i;
		 i=hesh(i+1);
		}
       return -1;
      }
/////////////////////////////////////////////////////////////////////////////
void del (info g)
	  {
	   int i=hesh(g.tab);
	   if (search) T[i].tab=NULL;
	  }

void record()
      {
       ofstream fl("1.txt");
       for (int i=0; i<N; i++)
		if (T[i].tab!=0)
			fl<<T[i].tab<<"\t"<<T[i].fam<<"\t"<<T[i].oklad<<endl;
      }
F1nt вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
УДаление строки из файла методом создания временного файла. dykatob Общие вопросы C/C++ 3 28.05.2011 01:46
Удаление файла gavrylyuk Microsoft Office Excel 9 26.11.2010 09:03
Удаление из файла Шурик Общие вопросы Delphi 4 30.05.2009 23:08
Удаление файла mopozoff Общие вопросы Delphi 1 13.06.2008 21:25
Удаление файла Македонский Общие вопросы Delphi 5 06.09.2007 11:46