Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 14.07.2017
Сообщений: 13

Сохранение и загрузка данных множества set

24.07.2017, 09:56. Показов 1246. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пишу свое первое приложение, телефонная книга.
Использую контейнер для хранения контактов set<Phonebook> Contacts, где
Phonebook структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct PhoneBook
{
    string Name;
    string Number;
    string ShowInfo;
 
    PhoneBook (const string& strName, const string& strNumber)
    {
        Name = strName;
        Number = strNumber;
        ShowInfo = (Name + ":   " + Number);
    }
...}
Скажите, как мне реализовать сохранение контактов в файл и затем загрузку их же из него при новом открытии приложения, чтобы добавить новый контакты и сохранить его.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2017, 09:56
Ответы с готовыми решениями:

Загрузка данных, построение графика, сохранение и очистка данных
здравствуйте, нужно написать программу, в которой будет построение графика, кнопки: загрузка данных, нарисовать график, сохранение данных и...

Кейлогер, сохранение данных и загрузка в базу данных
Здравствуйте, подскажите пожалуйста, как через клиент C# сохранять данные кейлогера, в базу данных, через сервер WCF

Сохранение данных из едитов и загрузка данных из файла
Здравствуйте! Задача следующего плана. У меня на форме 9 едитов, я ввожу в них данные и по нажатию кнопки, все данные с этих эдитов...

6
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.07.2017, 10:23
Цитата Сообщение от yti Посмотреть сообщение
реализовать сохранение контактов в файл
смотря как именно вам нужно их записать, самая обычная запись:
C++
1
2
3
    ofstream fout("имя_файла.расширение"); // создаём объект класса ofstream для записи и связываем его с файлом 
    fout << "Тестовая запись!"; // запись строки в файл
    fout.close(); // закрываем файл
Цитата Сообщение от yti Посмотреть сообщение
затем загрузку их же из него
как вариант:
C++
1
2
3
4
5
6
7
8
9
    ifstream fin("имя_файла.расширение"); //создаем объект потока istream  по имени fin
 
    string str;         //переменная стринг для строки                                
    while(getline(fin,str)) //getline(istream & is, string &s,char c='\n'),читает из потока is, в строку s пока 
    {                   // не встретит символ c (без этого символа до новой строки)
                         // возвращает свой объект istream, в условии проверяется состояние iostate флагa, значение этого флага         
                         // будет ложным, если достигнет конца файла, или будет ошибка ввода или читаемого типа
          fncn(str); // вызываем нужною функцию для полученной строки
    }
Цитата Сообщение от yti Посмотреть сообщение
чтобы добавить новый контакты и сохранить его
что нибудь делать со строкой можно в теле цикла
Code
1
while(getline(fin,str))
0
0 / 0 / 0
Регистрация: 14.07.2017
Сообщений: 13
24.07.2017, 10:42  [ТС]
Azazel-San, нет ну с записью строки или переменной это то понятно, это дело вопросов не вызывает.

Тут же надо сохранить множество структур, в каждой из которых три параметра string, два используются для хранения имени и номера контакта, а третий параметр для вывода на экран контакта. У меня в приложении реализован поиск по имени и поиск по номеру.
Вот не знаю, как сохранить так, чтобы при запуске приложения в структуре PhoneBook Каждому Name соответствовал свой Number.
Весь код:
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <set>
#include <algorithm>
 
using namespace std;
 
string NameInput;
string NumberInput;
 
template <typename T>
void ShowContacts(const T& Input)
{
    int num = 1;
    for(typename T::const_iterator ContactFound = Input.begin(); ContactFound != Input.end(); ++ ContactFound)
        {
            cout << num << ". " << *ContactFound << endl;
            num++;
        }
}
template <typename T>
void SearchNumber(const T& Input)
{
    cout << "Введите имя пользователя: ";
    getline(cin, NameInput);
    typename  T::iterator ContactFound = find(Input.begin(), Input.end(), typename T::key_type(NameInput,""));
        if(ContactFound != Input.end())
            cout << *ContactFound;
        else
            cout << "Номер с таким именем не найден\n";
}
template <typename T>
void AddContact (T& Input)
{
    do
    {
        cout << "Введите имя: ";
        getline(cin, NameInput);
        typename  T::iterator ContactFound = find(Input.begin(), Input.end(), typename T::key_type(NameInput,""));
        if(ContactFound != Input.end())
            cout << endl << "Номер с таким именем уже существует!\n" << endl;
        else
            break;
    }while(1);
    do
    {
        cout << "Введите номер: ";
        getline(cin, NumberInput);
        typename  T::iterator ContactFound = find_if(Input.begin(), Input.end(), typename T::key_type("", NumberInput));
        if(ContactFound != Input.end())
            cout << endl << "Такой номер уже есть в списке: " << *ContactFound << endl << endl;
        else
            break;
    }while(1);
 
    Input.insert(typename T::key_type(NameInput, NumberInput));
    cout << endl << "Номер добавлен в новый контакт: " << NameInput << " - " << NumberInput << endl;
}
template <typename T>
void DeleteContact(T& Input)
{
    char answer;
    cout << "Введите имя пользователя: ";
    getline(cin, NameInput);
    typename  T::iterator ContactFound = find(Input.begin(), Input.end(), typename T::key_type(NameInput,""));
        if(ContactFound != Input.end())
        {
            cout << "Вы действительно хотите удалить контакт " << *ContactFound << ".\nНажмите Y/N" << endl;
 
            while(answer != 'y' && answer != 'n')
            {
                answer = getch();
                if (answer == 'y')
                {
                    Input.erase(typename T::key_type(NameInput,""));
                    cout << "Номер удален!\n";
                }
                else if (answer == 'n')
                    cout << "Удаление отменено!\n";
                else
                    cout << "Нажмите кнопку Y(Да) или N(Нет)" << endl;
            };
        }
        else
            cout << "Номер с таким именем не найден\n";
};
struct PhoneBook
{
    string Name;
    string Number;
    string ShowInfo;
 
    PhoneBook (const string& strName, const string& strNumber)
    {
        Name = strName;
        Number = strNumber;
        ShowInfo = (Name + ":   " + Number);
    }
 
    bool operator < (const PhoneBook& itemToMatch) const
    {
        return (Name < itemToMatch.Name);
    }
 
    bool operator == (const PhoneBook& itemToMatch) const
    {
        return (itemToMatch.Name == Name);
    }
    bool operator () (const PhoneBook& NumberToMatch) const
    {
        return (NumberToMatch.Number == Number);
    }
 
    operator const char*() const
    {
        return ShowInfo.c_str();
    }
};
void menu()
{
    cout << "1. Найти номер\n" << "2. Добавить номер\n"
         << "3. Удалить номер\n" << "4. Показать все номера книги\n"
         << "5. Выход" << endl;
 
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    set<PhoneBook> Contacts;
    Contacts.insert(PhoneBook("Tolik", "89000435"));
    Contacts.insert(PhoneBook("Kolik", "845435"));
    Contacts.insert(PhoneBook("Bolik", "8685685435"));
    Contacts.insert(PhoneBook("Arik", "84"));
    Contacts.insert(PhoneBook("Cacik", "8454321241215"));
 
    int ch = 0;
    while(ch != 53)
    {
        menu();
        ch = getch();
        system("cls");
 
        if(ch != 49 && ch != 50 && ch != 51 && ch != 52 && ch != 53)
            cout << "Введено неверное значение, повторите ввод!\n\n";
        else
            {
                switch(ch)
                {
                    case 49:
                        SearchNumber(Contacts);
                            break;
                    case 50:
                        AddContact(Contacts);
                            break;
                    case 51:
                        DeleteContact(Contacts);
                            break;
                    case 52:
                        ShowContacts(Contacts);
                            break;
                }
 
                cout << endl << "Нажмите любую клавишу для выхода в меню.\n";
                getch();
                system("cls");
            }
    }
    return 0;
}
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.07.2017, 11:22
Цитата Сообщение от yti Посмотреть сообщение
Тут же надо сохранить множество структур
структуру в файл? вы можете просто записать имя и номер в файл, строкой и так для каждого нового пользователя, создавая что-то типо БД.
Цитата Сообщение от yti Посмотреть сообщение
Вот не знаю, как сохранить так, чтобы при запуске приложения в структуре PhoneBook Каждому Name соответствовал свой Number.
можно сделать что-то типо id каждого пользователя по которому вы бы могли обратится к нему, т.е. выбираете пользователя под id == 5, вам выводит Cacik 8454321241215
0
0 / 0 / 0
Регистрация: 14.07.2017
Сообщений: 13
24.07.2017, 12:22  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
можно сделать что-то типо id каждого пользователя по которому вы бы могли обратится к нему
то есть id это ключ а Cacik 8454321241215 это значение? А как тогда программа будет определять, что из этого значения Имя это Name для структуры PhoneBook, а Номер это Number. Ведь она же будет считывать и имя и номер как одну строку.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.07.2017, 12:53
yti, хотя все даже проще, пишите в файл как вывод в консоль, в одной строке через пробел будет Имя и телефон.
считывать вы будете построчно, т.е. вам будет считывать в формате Имя и телефон, пока не встретится переход на новую строку (enter)
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
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
struct PhoneBook
{
private:
    string Name;
    string Phone;
public:
    void push(string pushName, string pushPhone) // добавление 
    {
        Name = pushName;
        Phone = pushPhone; 
    }
    
    void inFile() // запись в файл
    {
        ofstream fout(fileName);
        fout << Name << " " << Phone << endl; 
        fout.close();
    }
 
    void fromFile()
    {
        string s;
        ifstream file(fileName); // файл из которого читаем 
 
        while(getline(file, s))
        { // пока не достигнут конец файла класть очередную строку в переменную (s)
            cout << s << endl; // выводим на экран
        }
        file.close(); // обязательно закрываем файл
    }
};
 
int main() 
{
    PhoneBook pb;
    
    pb.push("Ivan", "123456789");
    pb.inFile();
    pb.fromFile();
    
    
    return 0;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.07.2017, 16:59
Цитата Сообщение от yti Посмотреть сообщение
Скажите, как мне реализовать сохранение контактов в файл и затем загрузку их же из него при новом открытии приложения, чтобы добавить новый контакты и сохранить его.
JSON. Или брать готовую библиотеку, или собрать свой вариант на коленке. Решения на коленке скорее всего будут уязвимы к "а что если кто-то запихал в имя кавычку/двоеточие/что там у вас еще разделителем".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2017, 16:59
Помогаю со студенческими работами здесь

Сохранение и загрузка данных
Только недавно начал работать в VB и создавать программу. Мне нужно что бы по нажатию кнопки, программа сохраняла данные которые находятся...

Сохранение и загрузка данных
Добрый день! Есть программа совмещающая WinAPI и OpenGL. Хотелось бы к этому счастью подключить возмоность сохранения данных и их...

Загрузка данных о студентах в массив и хеш-множества
У меня вот такое задание: Все записи хранятся в отдельном отсортированном списке и упорядочены в нем по полю name. Кроме этого существуют...

Сохранение и загрузка базы данных
Собственно, пытаюсь сделать базу данных для генеалогического древа. Пока что выходит криво. Создать саму бд получилось, могу её заполнить....

Сохранение и загрузка введенных данных
Добрый день! Как реализовать верхнюю часть программы? Необходимо введенные данные сохранять под определенным именем и потом загружать.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru