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

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

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

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

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

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

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

Неправильно выводятся данные структуры - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; #define deathgant 7 using namespace std; union tag_value{ int...

Неправильно читает данные из файла - C++
Ситуация следующая. Выполняю ввод данных(фамилия и возраст), затем они записываются в структурированный файл(функция newfile). После этого...

Неправильно считываются данные из wav-файла - C++
Всем привет! У меня проблема с получением данных из WAV файла. Почему то функция, которая написана ниже, возвращает размер блока data в 2...

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно] - C++
Спасибо что решили зайти. Задание выгладит так: http://*******/PW95p А результат выплнения: http://*******/KwhuS #include...

5
ShadowFirst
55 / 48 / 1
Регистрация: 31.10.2013
Сообщений: 161
14.01.2014, 15:38 #2
Понятное дело будут меняться, прежде чем добавить очередной элемент вы должны добраться до конечного, а вы данные записываете в тот же
0
KyDryg
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 3
14.01.2014, 16:02  [ТС] #3
Но если я убираю везде указатели и запускаю свою программу, то она все правильно сохраняет и выводит, может проблема в этом ?
0
ShadowFirst
55 / 48 / 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);
    }
1
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 и все выводит нормально
0
ShadowFirst
55 / 48 / 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;
это не правильно, вернее не совсем правильно, достаточно просто объявить указатели и не надо выделять по одному байту на каждый.
0
14.01.2014, 19:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 19:01
Привет! Вот еще темы с ответами:

Не правильно сохраняет текст в файл - C++
int otchet(l_lib *l, int lines_count) { int X = 0; int Q = 0; int P = 0; char *fname = (char *)malloc(64); /* имя файла */ ...

Как компилятор сохраняет константы? - C++
Вопрос такой. Компилятор на этапе компиляции умножает константы в коде типа 1000 * 5, M_PI * 5 или допустим если функция несколько раз...

Запись в blob.Не сохраняет jpeg. - C++
БД Paradox 7. Подгружаю в TImage картинку,нажимаю сохранить и она исчезает.В обработчике кнопки следующий код: ...

ofstream.flush() не обновляет файл! (не сохраняет на диск) - C++
ofstream logfile; ... { .. logfile.open(&quot;log.txt&quot;, ios::out | ios::app); .. } .. { ..


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

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

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