Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
#1

Удаление из файла определенной записи - C++

26.01.2014, 16:09. Просмотров 364. Ответов 8
Метки нет (Все метки)

Новые записи сохраняются в файле нормально, а вот как удалить определённую запись не могу понять. Подскажите, если можно то в самой функции del. Это задача на тему хеш. Сам файл например такого содержания (таб номер, фамилия и оклад)
6256 Mihin 4560
4322 Muhin 4500
7756 Kuzin 1900
4622 Komarov 9000
3322 kyznec 4000
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#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;
      }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2014, 16:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление из файла определенной записи (C++):

Удаление записи из файла - C++
Здравствуйте. Помогите пожалуйста над задачей, которую я не смог написать. Нужно удалить запись из файла, я понимаю, что нужно записывать...

Удаление записи из файла - C++
Вот код который добавляет 10 записей в файл..(не компилил, но работать он должен) #include &lt;iostream&gt; #include &lt;fstream&gt; using...

Удаление файла записи - C++
Подскажите пожалуйста функцию удаления файла .txt

Удаление записи из бинарного файла - C++
Задача - удалить запись из бинарного запись по имени find находит запись, которую нужно удалить cur - текущая позиция del - удаляемая...

Удаление записи из бинарного файла - C++
Добрый вечер! У меня проблема не могу удалить из структуры. Добавление и считывание из бинарного файла я сделал. Удаление не...

Удаление из файла указанной записи - C++
Имеется текстовый файл из которого нужно удалить указанную пользователем запись.Каким образом можно реализовать?

8
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 21:07 #2
Удалять структуру из массива и файл переписывать.
0
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
26.01.2014, 21:13  [ТС] #3
Я пробовал переписать. К сожалению у меня не получается...
0
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 21:18 #4
Цитата Сообщение от Fintt Посмотреть сообщение
Я пробовал переписать. К сожалению у меня не получается...
А в чём проблема? Удалить из массива или файл переписать?
0
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
26.01.2014, 21:24  [ТС] #5
В принципе и то и другое. Добавить не проблема, это всё понятно как добавлять, я не пробовал удалять определённой записи. Я читал что это не возможно. Либо можно в другой файл переписать данные без удалённых. Но нужно с одним файлом работать. Я пробовал переписать в функции del. Но там проблема тоже возникла... Я попробую сейчас ещё раз кое-что попробовать.
0
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 21:31 #6
Цитата Сообщение от Fintt Посмотреть сообщение
Но нужно с одним файлом работать.
Окрыли файл в таком режиме:
C++
1
ofstream f("1.txt");
Старые данные стёрты, переписывайте массив. Проще создать динамический массив структур. При удалении структуры, создавать новый массив, переписывать в него структуры из старого, без удаляемой структруры, удалять старый массив. Записывать новый массив в файл.
0
zss
Модератор
Эксперт С++
6876 / 6438 / 2155
Регистрация: 18.12.2011
Сообщений: 16,924
Завершенные тесты: 1
26.01.2014, 21:31 #7
Можно и не удалять.
Просто в цикле записи поставьте условный оператор
C++
1
2
3
4
5
6
7
ostream ff("out.txt");
for(int i=0;i<N;i++)
{
    if(i!=Nudal)
         ff.write(&T[i],sizeof(info));
}
ff.close();
0
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 21:35 #8
Цитата Сообщение от zss Посмотреть сообщение
Можно и не удалять.
Просто в цикле записи поставьте условный оператор
Можно, но тогда нужно массив переписывать новыми данными из файла, и не забыть уменьшить значение N.
0
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
27.01.2014, 20:31  [ТС] #9
Понятно,
C++
1
ofstream f("1.txt");
, файл отчистился. Тогда какой массив взять чтоб переписать. С главной функции нечего взять, я запутался уже.

Добавлено через 21 час 50 минут
Вопрос решён, всем спасибо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#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;
      }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 20:31
Привет! Вот еще темы с ответами:

Удаление одной записи из БД без перезаписи всего файла - C++
Здравствуйте :) Наверное, по моему вопросу много информации в интернете, но я не знаю, как сформулировать его поисковику. Я...

"логическое" удаление записи из файла... - C++
Создаю простую БД. Как логически удалить выбранную запись из файла. При записи БД в служебное поле записывается порядковый номер записи,...

Удаление строки из файла\либо удаление самого файла. - C++
День добрый, вот функция(используемые переменные объявленны ранее): void delete_cruise() { FILE *fout; open_file(&quot;abase.dat&quot;); ...

Чтение определенной строки файла - C++
Как считать файл из определенной строки ?, например мне нужно узнать что написано во второй строке Я использую такой алгоритм но он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru