0 / 0 / 0
Регистрация: 13.05.2019
Сообщений: 7
1

Работа с бинарным файлом и массив структур

13.05.2019, 21:51. Показов 1109. Ответов 2

Задание следующее:
В компании одному номеру соответствует одно помещение, в помещении до 5 человек, нужно сначала внести данные в бинарный файл, после чего осуществить поиск по бинарному файлу: по номеру телефона выдает помещение и сотрудников внутри, по помещению - номер телефона, по имени сотрудника - номер помещения и номер телефона.
Пытался осуществить таким образом: в цикле одну структуру заполняю и тут же выгружаю в файл, после чего выгружаю файл в массив структур(для промежуточного результата вывожу на экран весь массив), и уже по этому массиву ищу.
Список проблем:
1) Не дает ввести имя первого сотрудника и сразу начинает со второго(делал какой то костыль, но тогда приходилось дважды enter прожимать)
2) В именах постоянно выводится набор символов, причем один и тот же
3) поиск вообще не работает
Много сидел в темах с подобными проблемами, но решения не подходили, только испортил код. Прошу помочь, уже сил нет работать над этой программой

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <locale>
#include <cstdio>
 
#define N 5
 
 
using namespace std;
 
struct number
{
    int num;
    int room;
    char name[255][N];
};
 
void to_file(number* a)
{
    ofstream fl;
    fl.open("list.dat", ios::binary | ios::app);
 
    fl.write((char*)&a->name, sizeof(a->name));
    fl.write((char*)&a->num, sizeof(a->num));
    fl.write((char*)&a->room, sizeof(a->room));
 
    fl.close();
}
 
 
void EnterStruct(int a, number* b)
{
    cout << endl << "Введите "<< a+1 <<" номер" << endl << endl;
    cin >> b->num;
    cout << endl << "Введите помещение" << endl << endl;
    cin >> b->room;
    
    for (int j = 0; j < N; j++)
    {
        
 
        cout << endl << "Имя " << j+1 << " сотрудника" << endl;
        
        cin.getline(b->name[j], 100);
        
    }
 
    to_file(b);
 
}
 
int CountOfStructs(number* b)
{
    int a=0;
    cout << "Сколько номеров вы хотите добавить?\n" << endl;
    cin >> a;
    for (int i = 0; i < a; i++)
    {
        EnterStruct(i, b);
        
    }
    return a;
}
 
void search()
{
    int size = sizeof(struct number);
    number out[N];
    int phone;
    int rm;
    char man[255];
    int a = 0;
    int b;
    ifstream fl;
    fl.open("list.dat", ios::binary);
    if (!fl.is_open())
        cout << "Файл не найден\n" << endl;
    else
    {
 
 
        for (int j = 0; !fl.eof(); j++)
        {
            //fl.read((char*)&out[j], sizeof(number));
            //char str[80];
            // Считывать и отображать записи в цикле, пока не eof
            fl.seekg(0); // вернуться к началу файла
            while (!fl.eof())
            {
                
                fl.read((char*)&out[j].num, sizeof(out[j].num));
                fl.read((char*)&out[j].room, sizeof(out[j].room));
                fl.read((char*)&out[j].name, sizeof(out[j].name));
 
 
                cout << endl << out[j].name << endl << endl;
                cout << endl <<out[j].room << endl << endl;
                cout << endl <<out[j].num << endl << endl;
 
            }
            b = j;
        }
 
 
 
        while (a != 4)
        {
            cout << "1 - поиск по номеру\n" << "2 - поиск по помещению\n" << "3 - поиск по фамилии\n" << "4 - завершить работу\n" << endl;
            cin >> a;
            switch (a)
            {
            case 1:
                cout << "Введите номер телефона" << endl;
                cin >> phone;
                for (int i = 0; i < b; i++)
                {
                    if (phone == out[i].num)
                    {
                        cout << endl << out[i].room << endl;
                        for (int d = 0; d < N; d++)
                            if (out[d].name[0] != " ")
                                cout << out[d].name << endl;
                            else
                                d++;
                    }
                }
 
                break;
            case 2:
                cout << "Введите номер помещения" << endl;
                cin >> rm;
                for (int i = 0; i < b; i++)
                {
                    if (rm == out[i].room)
                        cout << endl << out[i].num << endl;
                }
                break;
            case 3:
                cout << "Введите имя сотрудника" << endl;
                cin >> man[255];
                for (int i = 0; i < b; i++)
                {
                    for (int d = 0; d < N; d++)
                    {
                        if (man == out[i].name[d])
                        {
                            cout << endl << out[i].room << endl << out[i].num << endl;
 
                        }
                    }
                }
                break;
            case 4:
                break;
            }
 
        }
    }
    fl.close();
}
 
 
 
 
void choose(number* s)
{
    int a = 0;
    while (a != 4)
    {
        cout << "1 - добавление номера\n"  << "2 - поиск по файлу\n" << "3 - завершить работу\n" << endl;
        cin >> a;
        switch (a)
        {
            case 1:
                CountOfStructs(s);
                break;
            case 2:
                search();
                break;
            case 3:
                break;
        }
 
    }
}
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    number ph;
 
    choose(&ph);
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2019, 21:51
Ответы с готовыми решениями:

Работа с бинарным файлом
Доброго времени суток всем. Помогите пожалуйста доделать задачу: Создать класс для работы с...

Работа с бинарным файлом
Можно ли из бинарного файла выписывать строки?

Работа с бинарным файлом
Всем привет! есть тестовый пример в котором я пытаюсь записать в бинарный файл три переменных, а...

Работа с бинарным файлом
почему программа не выводит 16-ричный дамп бинарного файла? int main () { streamoff lSize; ...

2
Нарушитель
8298 / 4372 / 1002
Регистрация: 12.03.2015
Сообщений: 20,421
13.05.2019, 22:37 2
Цитата Сообщение от Finny-FIne Посмотреть сообщение
Много сидел в темах с подобными проблемами, но решения не подходили, только испортил код.
Не надо было тратить время на сидение в подобных темах. Ибо есть отладчик, который и предназначен для решения подобных проблем. Без него проги сложнее "хылоуворд" писать глупо и неэффективно. То, что ты полез на форум с вопросом "Не дает ввести имя первого сотрудника и сразу начинает со второго, чо делать, аааааа!!!.." - ещё одно этому подтверждение.
0
5666 / 3112 / 1299
Регистрация: 07.02.2019
Сообщений: 7,803
14.05.2019, 11:49 3
Лучший ответ Сообщение было отмечено Finny-FIne как решение

Решение

Finny-FIne,
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
 
constexpr size_t str_sz = 40;
constexpr size_t emp_sz = 5;
 
struct record
{
    size_t room;
    size_t phone;
    char employ[emp_sz][str_sz]{};
};
 
void fill_record(record&, size_t);
 
void find_by_room(const char*, size_t);
 
void find_by_phone(const char*, size_t);
 
void find_by_name(const char*, const char*);
 
int main()
{
    size_t n = 0;
    std::cout << "number of rooms >";
    std::cin >> n;
 
    std::cout << "file name to write >";
    char fname[str_sz];
    for (;std::cin && std::cin.get() != '\n';);
    if (!std::cin.getline(fname, str_sz)) exit(-1);
 
    std::ofstream ofs(fname, std::ios::binary | std::ios::out);
    for (size_t i = 0; i < n; ++i)
    {
        record rec;
        fill_record(rec, i + 1);
        ofs.write((const char*)&rec, sizeof(record));
    }
    ofs.close();
 
    std::cout << "room to find >";
    std::cin >> n;
    find_by_room(fname, n);
 
    std::cout << "phone to find >";
    std::cin >> n;
    find_by_phone(fname, n);
 
    std::cout << "name to find >";
    char name[str_sz];
    for (; std::cin && std::cin.get() != '\n';);
    if (!std::cin.getline(name, str_sz)) exit(-1);
    find_by_name(fname, name);
}
 
void fill_record(record& rec, size_t room)
{
    rec.room = room;
    std::cout << "room " << room << " phone >";
    std::cin >> rec.phone;
    size_t n = 0;
    std::cout << "number of employees(0-5) >";
    std::cin >> n;
    for (; std::cin && std::cin.get() != '\n';);
    if (n > emp_sz) n = emp_sz;
    for (size_t i = 0; i < n; ++i)
    {
        std::cout << i + 1 << " >";
        if (!std::cin.getline(rec.employ[i], str_sz)) exit(-1);
    }
}
 
void find_by_room(const char* fname, size_t room)
{
    std::ifstream ifs(fname, std::ios::binary | std::ios::in);
    for (record rec; ifs.read((char*)&rec, sizeof(record)); std::cout << '.')
        if (rec.room == room)
        {
            std::cout << "\nroom " << room << " phone: " << rec.phone << std::endl;
            return;
        }
    std::cout << "room " << room << " not found" << std::endl;
}
 
void find_by_phone(const char* fname, size_t phone)
{
    std::ifstream ifs(fname, std::ios::binary | std::ios::in);
    for (record rec; ifs.read((char*)&rec, sizeof(record)); std::cout << '.')
        if (rec.phone == phone)
        {
            std::cout << "\nphone " << phone << " room: " << rec.room << std::endl
                << "employees:\n";
            for (size_t i = 0; rec.employ[i][0] && i < emp_sz; ++i)
                std::cout << rec.employ[i] << std::endl;
            return;
        }
    std::cout << "phone " << phone << " not found" << std::endl;
}
 
void find_by_name(const char* fname, const char* employ)
{
    std::ifstream ifs(fname, std::ios::binary | std::ios::in);
    for (record rec; ifs.read((char*)&rec, sizeof(record)); std::cout << '.')
        for (size_t i = 0; rec.employ[i][0] && i < emp_sz; ++i, std::cout << '.')
            if (strstr(rec.employ[i], employ))
            {
                std::cout << "\nemployee " << employ << " room " << rec.room
                    << " phone " << rec.phone << std::endl;
                return;
            }
    std::cout << "employee " << employ << " not found" << std::endl;
}
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2019, 11:49
Помогаю со студенческими работами здесь

Работа со структурой и бинарным файлом
Что может быть за ошибка в case 2? struct sport_complex{//Структура struct trainers{ char...

Работа с бинарным файлом(Подсчет записей)
void open_bin(l_lib *l, int lines_count) // функция для открытия bin файла { fstream...

Выводится одна лишняя строка (работа с бинарным файлом)
Буду благодарен за помощь. #include&lt;iostream&gt; #include &lt;fstream&gt; #include &lt;algorithm&gt;...

Работа с бинарным файлом (Создать новый текстовый файл, в котором числа будут отсортированы в порядке возрастания.)
Аларм! Срочно прошу помощи! Есть задача: Записать бинарный файл с массивом целых чисел. Создать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru