Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Rary
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
1

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

11.11.2014, 00:00. Просмотров 901. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2014, 00:00
Ответы с готовыми решениями:

Плавное появление символа в консоли
Добрый день. Необходимо реализовать &quot;плавное&quot; появление столбца символов в...

Меню в консоли
есть код для менюшки, по идее при нажатии стрелок вверх или вниз, должен...

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

Меню в консоли
По условию нужно сделать что-то вроде меню в консоли. Чисто теоретически...

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

27
raister32
5 / 5 / 6
Регистрация: 16.12.2013
Сообщений: 67
11.11.2014, 00:13 2
Rary, слушай а ты в какой среде этот код писал?
0
Rary
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:13  [ТС] 3
Borland C++Builder 6
0
raister32
5 / 5 / 6
Регистрация: 16.12.2013
Сообщений: 67
11.11.2014, 00:18 4
Rary, при попытке запуска зацикливается менюшка которая в самом начале?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,226
11.11.2014, 00:18 5
Цитата Сообщение от Rary Посмотреть сообщение
При попытке добавления записи
Так а это что такое

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

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

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

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

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


Но в этом коде ничего не вводится в цикле. В этом у коде в цикле только выводится приглашение ввести название.
Я не знаю, но при зацикливании менюшки над ней появлялись вопросительные знаки, которые после каких-то манипуляций превратились в что-то непонятное http://joxi.ru/KAx5Y88iMw63r8.png
0
raister32
5 / 5 / 6
Регистрация: 16.12.2013
Сообщений: 67
11.11.2014, 00:31 11
ты попробуй писать на латинице)
0
Rary
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:33  [ТС] 12
Цитата Сообщение от raister32 Посмотреть сообщение
ты попробуй писать на латинице)
Так всё написано на латинице. На кириллице лишь комментарии к коду, которые не должны никак проявляться в коде.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,226
11.11.2014, 00:37 13
В любом случае, еще одна очевидная ошибка заключается в объявлении

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
Rary
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:37  [ТС] 14
После внесения остальной части функции в цикл, при выборе её в консоли, меню стало вызываться заново. При убирании цикла из функции при её вызове в консоле меню опять зацикливалось.
0
raister32
5 / 5 / 6
Регистрация: 16.12.2013
Сообщений: 67
11.11.2014, 00:38 15
поэтому надо написать char* rating, или char rating[256].
0
Rary
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
11.11.2014, 00:43  [ТС] 16
Исправил кириллицу на латиницу и поставил char rating[2];
А что с счётчиком в cin.getline? Не совсем понял, что с ним нужно сделать?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,226
11.11.2014, 00:44 17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Уж сколько раз твердили миру: если вам нужно хранить и читать строку длины 1, то массив должен быть объявлен с размером 2 и счетчик в 'cin.getline' тоже должен быть 2.
Совершенно аналогичная проблема имеет место и с остальными полями. Очевидно автор не понимает того элементарного факта, что для хранения С-строки длины N нужен массива размера как минимум N+1.

Массива

C++
1
char avail[3];
недостаточно для хранения ответа "YES". Строка "YES" требует 4 символа, а не 3. И счетчик в getline должен быть указан как 4, а не как 3.
1
raister32
5 / 5 / 6
Регистрация: 16.12.2013
Сообщений: 67
11.11.2014, 00:47 18
TheCalligrapher, профессионал, я даже про поля массива бы и не подумал)))
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,226
11.11.2014, 00:47 19
Цитата Сообщение от 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
5 / 5 / 6
Регистрация: 16.12.2013
Сообщений: 67
11.11.2014, 00:50 20
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
11.11.2014, 00:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2014, 00:50

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

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

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


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

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

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