Форум программистов, компьютерный форум CyberForum.ru

Неправильно сохраняет данные - C++

Восстановить пароль Регистрация
 
KyDryg
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 3
14.01.2014, 15:18     Неправильно сохраняет данные #1
Не могу понять в чем проблема. Каждый раз при вводе новых данных, изменяются старые. Вот код:
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <conio.h>
#include <iostream>
#include <locale.h>
#include <string.h>
 
using namespace std;
 
 
class phonebook {
  private:
    bool empty;     // признак конца списка
    char* key;      // информационная часть
    char* name;
    char* data;
    phonebook* next;    // указатель на следующий элемент
    
  public: 
    //конструктор без параметров
    phonebook(){
        empty=true;
    }
 
 
    //добавление элемента
   void Addend(char* n, char* k, char* d){
        if (empty){
          empty=false;
          name=n;
          key=k;
          data=d;
          next=new phonebook;
        }  
        else 
            next->Addend(n,k,d);
    }
 
    //поиск элемента по ключу
   phonebook* Find(char* n){
       if (empty || name==n) return this;
       return next->Find(n);
   }
    //удаление элемента по ключу 
   bool Delete(char* n){
        if (empty) return false;
        if (name==n){
            cout<<"\n delete "<<key<<"\n";
            phonebook* pv=next;
            if (next->empty) { 
                delete pv; 
                empty=true; 
            }
            else {
                name=next->name;  
                key=next->key;
                data=next->data;
                next=next->next; 
                pv->empty=true; delete pv; 
            }
            return true;
        }
        else return next->Delete(n);
   }
    //деструктор
  ~phonebook(){
      if (!empty) delete next;
  }
   
   //вывод списка
   void Show(){
      if   (empty)
          cout<<" finish\n";
      else {
          cout <<name;  
          cout <<"  " <<key;
          cout <<"  " <<data; 
          cout <<"\n";
  
      next->Show(); 
  }
   }
  };
 
   int main(){
    setlocale(LC_ALL, "");
    char* dr=new char;
    char* imya=new char;
    char* nom=new char;
    phonebook L;
    int menu = 7;
 
    while (menu!=0)
    {
        cout<<"Выберите действие"<<endl;
        cout<<"1 - Добавить контакт"<<endl;
        cout<<"2 - Удалить контакт"<<endl;
        cout<<"3 - Сортировать контакты по алфавиту"<<endl;
        cout<<"4 - Вывод списка"<<endl;
        cout<<"5 - Поиск контакта"<<endl;
        cout<<"0 - Для выходы из программы"<<endl;
        cin >>menu;
 
        switch(menu)
        {
        case 1:
            {
                cout<<"Введите Имя"<<endl;
                cin >>imya;
                cout<<"Введите номер "<<endl;
                cin >>nom;
                cout<<"Введите Дату Рождения "<<endl;
                cin >>dr;
                L.Addend(imya,nom,dr);
                break;
            }
        case 2:
            {
                cout<<"Введите Имя"<<endl;
                cin >>imya;
                L.Delete(imya);
                break;
            }
        case 3:
            {
                break;
            }
        case 4:
            {
                L.Show();
                break;
            }
        case 5:
            {
                cout<<"Введите Имя"<<endl;
                cin >>imya;
                L.Find(imya);
                break;
            }
 
        }
    }
   
    return 0;
   }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
14.01.2014, 15:38     Неправильно сохраняет данные #2
Понятное дело будут меняться, прежде чем добавить очередной элемент вы должны добраться до конечного, а вы данные записываете в тот же
KyDryg
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 3
14.01.2014, 16:02  [ТС]     Неправильно сохраняет данные #3
Но если я убираю везде указатели и запускаю свою программу, то она все правильно сохраняет и выводит, может проблема в этом ?
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
14.01.2014, 16:20     Неправильно сохраняет данные #4
Заранее извиняюсь был не прав в своем первом ответе. Дело действительно в указателях. У вас то они одни и те же во всех случаях. Что бы использовать указатели вам нужно под это выделять память, то есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Addend(char* n, char* k, char* d){
        if (empty){
          empty=false;
          int size = strlen(n);
          name= new char [size];
          memcpy (name, n, size);
          size = strlen(k);
          key=new char[size];
          memcpy (key, k, size);
          size = strlen(d);
          data=new char[size];
          memcpy (data, d, size);        
          next=new phonebook;
        }  
        else 
            next->Addend(n,k,d);
    }
KyDryg
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 3
14.01.2014, 17:28  [ТС]     Неправильно сохраняет данные #5
Данные сохраняются правильно, но теперь появилась другая проблема, при выводе списка выводит следующее:

Допустим мы ввели:
Имя - Jan
Номер - 20
День Рождение - 20

Нам выводит:
Janээээ
20ээээЭЭАКмF
20ээээЭЭЮКмF

Добавлено через 21 минуту
Помогли разобраться, надо было добавить memcpy (name, n, size+1); везде +1 и все выводит нормально
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
14.01.2014, 19:01     Неправильно сохраняет данные #6
Забыл что strlen не учитывает конец строки))) Забыл об этом. Действительно нужно было +1 к размеру добавлять.

И кстати:
C++
1
2
3
char* dr=new char;
    char* imya=new char;
    char* nom=new char;
это не правильно, вернее не совсем правильно, достаточно просто объявить указатели и не надо выделять по одному байту на каждый.
Yandex
Объявления
14.01.2014, 19:01     Неправильно сохраняет данные
Ответ Создать тему
Опции темы

Текущее время: 12:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru