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

Бесконечное появление меню в консоли

11.11.2014, 00:00. Показов 3927. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При попытке добавления записи через меню, меню начинает появляться в бесконечном количестве в консоли. Как исправить? Вроде проблема в функции main, но при запуске срабатывает нормально.
Кликните здесь для просмотра всего текста
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <windows.h>
#include <conio.h>
//using namespace std;
 
struct directory        //определение структуры directory
{
    char book[40];      //название книги
    char author[40];    //автор
    char publ[20];      //издательство
    char type[20];      //раздел библиотеки
    char avail[3];      //наличие
    char origin[15];    //происхождение
    char  rating[1];     //субъективная оценка
};
directory mass[60]; //массив структур
int N;//количество элементов
char filename[] = "Biblio.txt";
int inFile()//чтение из файла 
{
    ifstream fr;      // входной файловый поток 
    fr.open(filename); // открываем файл и связываем его с потоком fr
    if (!fr)          // Проверить правильность открытия файла
    { 
        cerr << "File not found\n";
        return 0;           
    }
    N=0;
    while(!fr.eof())//читаем элементы из файлового потока fr
    {
        fr>>mass[N].book;
        if(mass[N].book[0]=='\0') break;
        fr>>mass[N].author;
        fr>>mass[N].publ;
        fr>>mass[N].type;
        fr>>mass[N].avail;
        fr>>mass[N].origin;
        fr>>mass[N].rating;
        N++;
    } 
    fr.close();//закрытие потока
    cout<<"\nRead data from the file "<<filename<<endl;
    return 0;
}
int Out()//вывод записей на экран
{
 
    if(mass[0].book[0]=='\0') 
    {
        system("cls");
        cout<<"\nNo records. Take a reading from the file.\n";
        return 0;
    }
    else
    system("cls");
    for(int i=0;i<N;i++)//цикл по записям
        cout<<i<<". "<<mass[i].book<<" "<<mass[i].author<<" "<<mass[i].publ<<" "<<
        mass[i].type<<" "<<mass[i].avail<<" "<<mass[i].origin<<" "<<mass[i].rating<<endl;//вывод на экран записей
    return 0;
}
int outFile()//вывод записей в файл 
{
    ofstream fr;      // выходной файловый поток   
    fr.open(filename); // открываем файл и связываем его с потоком fr
    if (!fr)          // Проверить правильность открытия файла
    { 
        cerr << "\nFile not found\n";
        return 0;            
    }
    if(mass[0].book[0]=='\0') //если нет записей в структуре
    {
        cout<<"\nNo records. Take a reading from the file.\n";
        return 0;
    }
    for(int i=0;i<N;i++)//запись элементов в файловый поток
    {
        fr<<mass[i].book<<endl;
        fr<<mass[i].author<<endl;
        fr<<mass[i].publ<<endl;
        fr<<mass[i].type<<endl;
        fr<<mass[i].avail<<endl;
        fr<<mass[i].origin<<endl;
        fr<<mass[i].rating<<endl;
    }
    fr.close();
    cout<<"\nData in the file recorded\n "<<filename<<endl;
    return 0;
}
 
int Add()//добавление записей
{
    cin.clear();
    while(cin.get() != '\n')
    cout <<"Enter name of book: " << endl;
    cin.getline(mass[N].book,40);
    cout <<"Enter author: " << endl;
    cin.getline(mass[N].author,40);
    cout <<"Enter publishing house: " << endl;
    cin.getline(mass[N].publ,20);
    cout <<"Enter type: " << endl;
    cin.getline(mass[N].type,20);
    cout <<"Availability? YES/NO: " << endl;
    cin.getline(mass[N].avail,3);
    cout <<"Origin of book: " << endl;
    cin.getline(mass[N].origin,15);
    cout <<"Enter rating (1-5): " << endl;
    cin.getline(mass[N].rating,1);
    N++;
    Out();
    outFile();
    return 0;
}
int Delete()//удаление записей
{
    int n, i;
    cout<<"\nEnter the number of the item to remove ";
    cin>>n;
    i=n;
    while(i<N)  //смещаем элементы массива на 1, тем самым удаляем n-1 элемент
    {
        mass[i]=mass[i+1];
        i++;
    }
    mass[N-1].book[0]='\0';//удаляем послед элемент
    N--;//уменьшаем количество элементов на 1
    Out();
    outFile();
    return 0;
}
int Sortbyauthor()//сортировка по author
{
    if(mass[0].book[0]=='\0') //если нет записей в структуре
    {
        system("cls");
        cout<<"\nNo records. Take a reading from the file.\n";
        return 0;
    }
    //сортировка методом простого обмена
    for(int i=0;i<N;i++)
        for(int j=N-1;j>=i;j--)
            if(strcmp(mass[j].author,mass[j-1].author)<=0)
                {
                    directory buf=mass[j];
                    mass[j]=mass[j-1];
                    mass[j-1]=buf;
                };
    outFile();      
    Out();
    cout<<"\nSorting finished.\n";
    return 0;
}
int Sortbytype()
{
    if(mass[0].book[0]=='\0') 
    {
        system("cls");
        cout<<"\nNo records. Take a reading from the file.\n";
        return 0;
    }
    for(int i=0;i<N;i++)
        for(int j=N-1;j>=i;j--)
            if(strcmp(mass[j].type,mass[j-1].type)<=0)
                {
                    directory buf=mass[j];
                    mass[j]=mass[j-1];
                    mass[j-1]=buf;
                };
    outFile();
    Out();  
    cout<<"\nSorting finished.\n";
    return 0;
}
int Find()//поиск записей по запросу название и автор
{
    if(mass[0].book[0]=='\0') //если нет записей в структуре
    {
        system("cls");
        cout<<"\nNo records. Take a reading from the file.\n";
        return 0;
    }
    char fbook[40];
    char fauthor[40];
    cout<<"Enter book`s name: ";
    cin>>fbook;
    cout<<"Enter author`s name: ";
    cin>>fauthor;
    for(int i=0;i<N;i++) 
        if((strcmp(mass[i].book,fbook)==0)&&(strcmp(mass[i].author,fauthor)==0))
        {
            cout<<mass[i].avail<<endl;
            break;
        }
    system("cls");  
    return 0;
}
int what()
{
system("cls");
cout<<"\nWhat is this? O_o\n";
}
 int main()
{
    if (inFile()!=0) {cout << "Cannot read file" << endl;return 0;};
    int N=0;//Номер пункта
    while(N!=8) 
    {
        //----меню вывода--------
        cout<<"\nEnter the item number:\n P.s. I like Gabe Newell don`t know the number 3 =D\n";
        cout<<"1: display\n";
        cout<<"2: sorting by author\n";
        cout<<"4: sorting by type\n";
        cout<<"5: find the book\n";     
        cout<<"6: add a record\n";
        cout<<"7: delete a record\n";
        cout<<"8: exit\n";
        //----------------------
        cin>>N;//считываем из экрана номер пункта
        switch(N)
        {
        case 1: Out(); break; //вывод на экран
        case 3: what(); break; //вывод на экран what()
        case 2: Sortbyauthor(); break;//сортировка по автору
        case 4: Sortbytype(); break;//сортировка по разделу
        case 5: Find(); break;//Поиск книги
        case 6: Add(); break;//добавление
        case 7: Delete(); break;//удаление записей
        default: cout<<"\nНекорректный номер пункта\n"; break;
        }
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2014, 00:00
Ответы с готовыми решениями:

Плавное появление символа в консоли
Добрый день. Необходимо реализовать &quot;плавное&quot; появление столбца символов в консоли. Идея сего действия заключается в следующем: Разбиваем...

Меню в консоли
По условию нужно сделать что-то вроде меню в консоли. Чисто теоретически порядок знаю, но с реализацией проблемы((( в while массив из 5...

Меню в консоли
Меня интересует вот что: зачем в функции int menu(); вот это условие code=getch(); if (code==224) ...

27
 Аватар для raister32
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
11.11.2014, 00:13
Rary, слушай а ты в какой среде этот код писал?
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:13  [ТС]
Borland C++Builder 6
0
 Аватар для raister32
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
11.11.2014, 00:18
Rary, при попытке запуска зацикливается менюшка которая в самом начале?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
11.11.2014, 00:18
Цитата Сообщение от Rary Посмотреть сообщение
При попытке добавления записи
Так а это что такое

C++
1
2
while(cin.get() != '\n')
    cout <<"Enter name of book: " << endl;
Почему приглашение на ввод названия книги делается в цикле?
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:21  [ТС]
Нет. Менюшка исправно включается. Когда отправляешь 6, требуется, что-то опять отправить, а потом уже анкета мол введите то, введите другое и, когда уже всё ввёдешь зацикливается менюшка, которая была вначале, и вопросительные знаки над нею.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
11.11.2014, 00:23
Цитата Сообщение от Rary Посмотреть сообщение
Нет.
Что значит "нет"?

Еще раз: почему приглашение на ввод названия книги делается в цикле? Этот вопрос не допускает ответа "нет".
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:24  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а это что такое

C++
1
2
while(cin.get() != '\n')
    cout <<"Enter name of book: " << endl;
Почему приглашение на ввод названия книги делается в цикле?
Я частично взял чужой работающий код, по похожей схеме. Там название объекта и его данные вводились в цикле.
Предыдущий пост был ответом на вопрос другого человека.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
11.11.2014, 00:28
Цитата Сообщение от Rary Посмотреть сообщение
и вопросительные знаки над нею.
Я не вижу в программе никаких "вопросительных знаков" ни над каким "менюшками". О каких "вопросительных знаках" идет речь?

Добавлено через 3 минуты
Цитата Сообщение от Rary Посмотреть сообщение
Там название объекта и его данные вводились в цикле.
Но в этом коде ничего не вводится в цикле. В этом у коде в цикле только выводится приглашение ввести название.
1
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:30  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я не вижу в программе никаких "вопросительных знаков" ни над каким "менюшками". О каких "вопросительных знаках" идет речь?

Добавлено через 3 минуты


Но в этом коде ничего не вводится в цикле. В этом у коде в цикле только выводится приглашение ввести название.
Я не знаю, но при зацикливании менюшки над ней появлялись вопросительные знаки, которые после каких-то манипуляций превратились в что-то непонятное
0
 Аватар для raister32
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
11.11.2014, 00:31
ты попробуй писать на латинице)
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:33  [ТС]
Цитата Сообщение от raister32 Посмотреть сообщение
ты попробуй писать на латинице)
Так всё написано на латинице. На кириллице лишь комментарии к коду, которые не должны никак проявляться в коде.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
11.11.2014, 00:37
В любом случае, еще одна очевидная ошибка заключается в объявлении

C++
1
char  rating[1];     //субъективная оценка
и последующем вызове

C++
1
cin.getline(mass[N].rating,1);
Массив размера 1 не может хранить никакую строку, кроме пустой. Единственный элемент массива тратится на хранение нулевого терминатора.

Аналогично счетчик в методе 'getline' должен включать место для нулевого терминатора. Это означает что вышеприведенный вызов 'cin.getline' читает ровно 0 символов - т.е. не читает вообще ничего.

Введенный данные (видимо, не числовые) остаются сидеть непрочитанными в буфере и затем мешают работать вызову 'cin>>N;'. 'cin>>N;' требует числовых данных. Увидев нечисловые, он не читает ничего и выходит. В результате цикл главного меню зацикливается навсегда из за того, что в буфере сидит не число.

Уж сколько раз твердили миру: если вам нужно хранить и читать строку длины 1, то массив должен быть объявлен с размером 2 и счетчик в 'cin.getline' тоже должен быть 2.

Добавлено через 1 минуту
Цитата Сообщение от Rary Посмотреть сообщение
Так всё написано на латинице.
Ну как же? А это

C++
1
cout<<"\nНекорректный номер пункта\n"; break;
Именно это вы и видите как кракозябры.
1
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:37  [ТС]
После внесения остальной части функции в цикл, при выборе её в консоли, меню стало вызываться заново. При убирании цикла из функции при её вызове в консоле меню опять зацикливалось.
0
 Аватар для raister32
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
11.11.2014, 00:38
поэтому надо написать char* rating, или char rating[256].
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:43  [ТС]
Исправил кириллицу на латиницу и поставил char rating[2];
А что с счётчиком в cin.getline? Не совсем понял, что с ним нужно сделать?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
11.11.2014, 00:44
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Уж сколько раз твердили миру: если вам нужно хранить и читать строку длины 1, то массив должен быть объявлен с размером 2 и счетчик в 'cin.getline' тоже должен быть 2.
Совершенно аналогичная проблема имеет место и с остальными полями. Очевидно автор не понимает того элементарного факта, что для хранения С-строки длины N нужен массива размера как минимум N+1.

Массива

C++
1
char avail[3];
недостаточно для хранения ответа "YES". Строка "YES" требует 4 символа, а не 3. И счетчик в getline должен быть указан как 4, а не как 3.
1
 Аватар для raister32
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
11.11.2014, 00:47
TheCalligrapher, профессионал, я даже про поля массива бы и не подумал)))
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
11.11.2014, 00:47
Цитата Сообщение от Rary Посмотреть сообщение
А что с счётчиком в cin.getline?
Счетчик в cin.getline должен быть таким же, как и размер массива. Т.е. 2, а не 1.

Возьмите в привычку для явных символьных массивов писать вообще вот так

C++
1
2
3
cin.getline(mass[N].book, sizeof mass[N].book);
...
cin.getline(mass[N].rating, sizeof mass[N].rating);
чтобы не ползать потом по коду и не исправлять в нескольких местах. Или заведите именованные константы с размерами.
1
 Аватар для raister32
6 / 6 / 6
Регистрация: 16.12.2013
Сообщений: 69
11.11.2014, 00:50
Rary, еще кое что поправь
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch(N)
        {
        case 1: Out(); break; //вывод на экран
        case 3: what(); break; //вывод на экран what()
        case 2: Sortbyauthor(); break;//сортировка по автору
        case 4: Sortbytype(); break;//сортировка по разделу
        case 5: Find(); break;//Поиск книги
        case 6: Add(); break;//добавление
        case 7: Delete(); break;//удаление записей
        case 8: break;
        default: cout<<"\nNekkorektniy vvod\n"; break;
        }
я тебе сделал уже case 8, а то в менюшке есть 8 ка, а при нажатии на нее выдает что некоректно введено. Сделал чтобы просто из программы выходило.
Было так
C++
1
2
3
4
5
6
7
8
9
10
11
 switch(N)
        {
        case 1: Out(); break; //вывод на экран
        case 3: what(); break; //вывод на экран what()
        case 2: Sortbyauthor(); break;//сортировка по автору
        case 4: Sortbytype(); break;//сортировка по разделу
        case 5: Find(); break;//Поиск книги
        case 6: Add(); break;//добавление
        case 7: Delete(); break;//удаление записей
        default: cout<<"\nNekkorektniy vvod\n"; break;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2014, 00:50
Помогаю со студенческими работами здесь

Меню на консоли
Здравствуйте! Изучаю C++, для практики ради делаю консольное меню через класс. Может быть мне, пока что, ещё далеко до претендента на...

Меню в консоли
есть код для менюшки, по идее при нажатии стрелок вверх или вниз, должен передвигаться флажок -&gt; , но почему то не передвигается,...

Оригинальное меню в консоли
Доброго вечера, помогите разобраться с некоторым кодом, в котором содержится интересное консольное меню с помощью goto xy. Искал в нэте...

Организация меню в консоли
всем доброе время суток необходимо организованить меню: Для выбора метода вычисления корня уравнения использовать меню, разработанное с...

Работа с меню в консоли
я написал программу #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;iomanip.h&gt; #include&lt;system.hpp&gt; int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru