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

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

Войти
Регистрация
Восстановить пароль
 
KyDryg
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 3
#1

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

14.01.2014, 15:18. Просмотров 237. Ответов 5
Метки нет (Все метки)

Не могу понять в чем проблема. Каждый раз при вводе новых данных, изменяются старые. Вот код:
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;
   }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 15:18     Неправильно сохраняет данные
Посмотрите здесь:

C++ Запись в blob.Не сохраняет jpeg.
неправильно считываются данные из WAV файла C++
C++ Неправильно читает данные из файла
Программа создает бинарный файл, но не сохраняет его в формате .bin, что делать?! C++
у меня есть прога. но минус в том, что она не сохраняет файл( C++
ofstream.flush() не обновляет файл! (не сохраняет на диск) C++
Неправильно выводятся данные C++
Неправильно выводятся данные структуры C++
C++ Реализовать программу, которая сохраняет три целые числа в текстовом файле и затем читает сохраненные данные
C++ Создать класс Rectangle, который сохраняет Декартовы координаты четырех вершин прямоугольника
Opencv-gabor filter не сохраняет результирующую картинку C++
C++ Как компилятор сохраняет константы?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     Неправильно сохраняет данные
Ответ Создать тему
Опции темы

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