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

Зацикливание программы при вводе - C++

Восстановить пароль Регистрация
 
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
04.05.2013, 18:20     Зацикливание программы при вводе #1
Добрый день.
У меня почему то происходит зацикливание программы при вводе строки с пробелами.
Есть структура
C++
1
2
3
4
5
6
7
8
9
10
struct sklad
{
    char nazva[200];
    int kilkist;
    float vaga;
    int sort;
    float tsina;
    char otrymuvach[20];
    char data[15];
};
И фунцкия
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
nt inPut()
{
    sklad tmp;
    ofstream file_out;
    char file_name[40];
    cout << "Vvedit imya failu: ";
    cin >> file_name;
    file_out.open(file_name, ofstream::binary | ofstream::out);
    if (!file_out.is_open())
    {
        cout << "Fail ne vidkrytyi dlia zapysu!" << endl;
        return 0;
    }
 
    cout << "Vvedit nazvu produktsii : ";
    cin >> tmp.nazva;
    cout << "Vvedit kiskist produktsii : ";
    cin >> tmp.kilkist;
    cout << "Vvedit vagu produktsii : ";
    cin >> tmp.vaga;
    cout << "Vvedit sort produktsii : ";
    cin >> tmp.sort;
    cout << "Vvedit tsinu produktsii : ";
    cin >> tmp.tsina;
    cout << "Vvedit otrymuvacha produktsii : ";
    cin >> tmp.otrymuvach;
    cout << "Vvedit datu vidgruzky : ";
    cin >> tmp.data;
    file_out.write((const char*)&tmp, sizeof(sklad));
    file_out.close();
}
Когда я пытаюсь записать в tmp.nazva строку с пробелами (например bla bla bla) программа зацикливается, когда пишу без пробелов, все работает как надо.
В чем может быть проблема ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 18:20     Зацикливание программы при вводе
Посмотрите здесь:

C++ Зацикливание программы при вводе некорректных данных
C++ Задачка про зацикливание при вводе не числа (решено но нужна консульт)
Зацикливание дочерней программы C++
C++ Составить программу, которая при вводе символа с клавиатуры выво-дит "латинская буква" при вводе латинской буквы и "не латинская бук-ва" во всех остал
зацикливание при вводе из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 768
Регистрация: 27.09.2012
Сообщений: 16,845
Записей в блоге: 2
Завершенные тесты: 1
04.05.2013, 18:23     Зацикливание программы при вводе #2
Цитата Сообщение от Triall Посмотреть сообщение
при вводе строки с пробелами.
перегруженный >> читает только до разделителя. Чтобы прочитать с пробелами можете воспользоваться cin.getline
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
04.05.2013, 18:27  [ТС]     Зацикливание программы при вводе #3
Croessmah, Попробовал вот так
C++
1
cin.getline(tmp.nazva, 20);
все равно зацикливание...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 768
Регистрация: 27.09.2012
Сообщений: 16,845
Записей в блоге: 2
Завершенные тесты: 1
04.05.2013, 18:32     Зацикливание программы при вводе #4
Чистите поток от мусора после ввода
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.05.2013, 18:32     Зацикливание программы при вводе #5
getline не будет работать , если в потоке остался символ перехода на новую строку.(а он похоже,что остался). Попробуйте очистить поток с помощью
C++
1
cin.ignore(numeric_limits<streamsize>::max(),'\n');
мне помогало
Подключить не забудьте
C++
1
#include <limits>
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 768
Регистрация: 27.09.2012
Сообщений: 16,845
Записей в блоге: 2
Завершенные тесты: 1
04.05.2013, 18:34     Зацикливание программы при вводе #6
Например, можете переписать примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    cout << "Vvedit nazvu produktsii : ";
    cin.getline(tmp.nazva,200);
    cout << "Vvedit kiskist produktsii : ";
    cin >> tmp.kilkist;
     cin.ignore(cin.rdbuf()->in_avail());
    cout << "Vvedit vagu produktsii : ";
    cin >> tmp.vaga;
     cin.ignore(cin.rdbuf()->in_avail());
    cout << "Vvedit sort produktsii : ";
    cin >> tmp.sort;
     cin.ignore(cin.rdbuf()->in_avail());
    cout << "Vvedit tsinu produktsii : ";
    cin >> tmp.tsina;
     cin.ignore(cin.rdbuf()->in_avail());
    cout << "Vvedit otrymuvacha produktsii : ";
     cin.getline(tmp.otrymuvach,20);
     cin.ignore(cin.rdbuf()->in_avail());
    cout << "Vvedit datu vidgruzky : ";
    cin >> tmp.data;
     cin.ignore(cin.rdbuf()->in_avail());
А лучше сделайте нормальную защиту от дурака еще
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
04.05.2013, 18:49  [ТС]     Зацикливание программы при вводе #7
Артем Смирнов, Помогло, спасибо. Только я не использовал
C++
1
numeric_limits<streamsize>::max()
, а написал вот так
C++
1
cin.ignore(20,'\n');
. Ведь первый аргумент cin.ignore это максимальное количество символов для извлечения. Или так не верно и я не прав ?
Поправьте пожалуйста.

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
cin.ignore(cin.rdbuf()->in_avail());
Не очень понятен смысл этой строки... Не могли бы Вы объяснить ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 19:01     Зацикливание программы при вводе
Еще ссылки по теме:

C++ Как сделать очередь и убрать паузу программы при вводе данных?
Зацикливание программы. В чем ошибка? C++
Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль C++

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

Или воспользуйтесь поиском по форуму:
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.05.2013, 19:01     Зацикливание программы при вводе #8
Да , это максимальное количество символов.

Вызывая функцию rdbuf()-обращаемся к буферу чтения , хранящему символу. Вызывая функцию in_avail() этого буфера, хотим узнать , сколько в нем содержится символов. Это количество символов нужно удалить по идее
Yandex
Объявления
04.05.2013, 19:01     Зацикливание программы при вводе
Ответ Создать тему
Опции темы

Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru