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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
#1

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

04.05.2013, 18:20. Просмотров 716. Ответов 7
Метки нет (Все метки)

Добрый день.
У меня почему то происходит зацикливание программы при вводе строки с пробелами.
Есть структура
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++
требуется ввести из файла в вектор данные типа float. программа зацикливается при выводе целой части вещественного числа. #include...

Задачка про зацикливание при вводе не числа (решено но нужна консульт) - C++
Все решено ошибка найдена если есть идеи могут предложить лучший алгоритм int NumberOfElements=0; //глобальная переменная int...

Неправльная работа программы при вводе нецифрового символа - C++
если ввести в этот код не цифру про программа уходит в вечный цикл. почему так происходит и что можно сделать? int d = 0; do ...

Некорректная работа программы,при вводе отрицательного числа - C++
Здравствуйте.Есть некий // { int c; char array; printf( &quot;Vvod: &quot; ); scanf( &quot;%d&quot;, &amp;c ); printf(...

При вводе полей структуры завершается работа программы - C++
Решаю задачи по Прата. При вводе полей структуры резко завершает программу. #include&lt;iostream&gt; using namespace std; struct CandyBar{ ...

Как сделать очередь и убрать паузу программы при вводе данных? - C++
Написал прогу, при вводе новый параметров детали программа останавливается, как можно переделать, что бы этого не было? И как сделать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
04.05.2013, 18:23     Зацикливание программы при вводе #2
Цитата Сообщение от Triall Посмотреть сообщение
при вводе строки с пробелами.
перегруженный >> читает только до разделителя. Чтобы прочитать с пробелами можете воспользоваться cin.getline
Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
04.05.2013, 18:27  [ТС]     Зацикливание программы при вводе #3
Croessmah, Попробовал вот так
C++
1
cin.getline(tmp.nazva, 20);
все равно зацикливание...
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
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     Зацикливание программы при вводе
Еще ссылки по теме:

При вводе пользователем числа от 0 до 9, вывести на экран название программы (использовать оператор goto) - C++
Программу по заданию я написал Написать программу для выполнения следующих действий. При вводе цифры от 0 до 9 будет выводиться ее...

Зацикливание дочерней программы - C++
Необходимо, например, 1000 раз выполнить откомпилированный файл (1.ехе). Можно это сделать, например так: for (int i = 0; i&lt;1000; i++) ...

Зацикливание программы. В чем ошибка? - C++
В чем причина зацикливания? При вводе числа x (по условию любое, например 2), на экран результат не выводится (ничего не происходит). ...

Зацикливание программы, найти ошибку в коде - C++
#define EE 1E-80 #define MAX_ROOTS 15 typedef struct { Complex root; int nor; // number of root int deg; // degree }...

зацикливание программы. Не могу найти понять что исправить - C++
При вводе буквы происходит зацикливание программы строчкой &quot;Введите 1ый катет:&quot; или &quot;Введите 2ой катет: &quot; ,смотря где ввести букву.......


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

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

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

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