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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день.
У меня почему то происходит зацикливание программы при вводе строки с пробелами.
Есть структура
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) программа зацикливается, когда пишу без пробелов, все работает как надо.
В чем может быть проблема ?
0
04.05.2013, 18:20
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2013, 18:20
Ответы с готовыми решениями:

Зацикливание программы при вводе некорректных данных
Привет всем! Я совсем новенький в программировании на С++ (в школе чуток увлекался Бейсиком, но забросил). Три дня назад решил освоить С++....

Зацикливание при вводе из файла
требуется ввести из файла в вектор данные типа float. программа зацикливается при выводе целой части вещественного числа. #include...

Зацикливание приложения при вводе в cin данных с пробелом
Есть такой код ( курсовой проект, не суть). Проблема такова: при вводе в переменную vak значения с пробелом приложение работает...

7
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,996
Записей в блоге: 1
04.05.2013, 18:23 2
Цитата Сообщение от Triall Посмотреть сообщение
при вводе строки с пробелами.
перегруженный >> читает только до разделителя. Чтобы прочитать с пробелами можете воспользоваться cin.getline
0
 Аватар для Triall
3 / 3 / 3
Регистрация: 16.02.2011
Сообщений: 68
04.05.2013, 18:27  [ТС] 3
Croessmah, Попробовал вот так
C++
1
cin.getline(tmp.nazva, 20);
все равно зацикливание...
0
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,996
Записей в блоге: 1
04.05.2013, 18:32 4
Чистите поток от мусора после ввода
0
6 / 6 / 0
Регистрация: 15.05.2012
Сообщений: 40
04.05.2013, 18:32 5
getline не будет работать , если в потоке остался символ перехода на новую строку.(а он похоже,что остался). Попробуйте очистить поток с помощью
C++
1
cin.ignore(numeric_limits<streamsize>::max(),'\n');
мне помогало
Подключить не забудьте
C++
1
#include <limits>
1
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,996
Записей в блоге: 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());
А лучше сделайте нормальную защиту от дурака еще
2
 Аватар для Triall
3 / 3 / 3
Регистрация: 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());
Не очень понятен смысл этой строки... Не могли бы Вы объяснить ?
0
6 / 6 / 0
Регистрация: 15.05.2012
Сообщений: 40
04.05.2013, 19:01 8
Да , это максимальное количество символов.

Вызывая функцию rdbuf()-обращаемся к буферу чтения , хранящему символу. Вызывая функцию in_avail() этого буфера, хотим узнать , сколько в нем содержится символов. Это количество символов нужно удалить по идее
1
04.05.2013, 19:01
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2013, 19:01
Помогаю со студенческими работами здесь

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

Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль
Что надо подключить что бы в консоли писать русскими буквами? cin &gt;&gt; kol; cin &gt;&gt; x; cout &lt;&lt; &quot;У вас есть &quot; &lt;&lt;...

Зависание программы при вводе чисел
Подскажите, пожалуйста. Почему при вводе чисел: 5 -1 -1 -1 -1 -1 Программа зависает? А при вводе других чисел всё нормально. Кусок...

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?
void mainmenu() { cout &lt;&lt; &quot;Введи число&quot; &lt;&lt; endl; cin &gt;&gt; choice; if (choice == 1) { cout &lt;&lt; &quot;Hello&quot; &lt;&lt; endl; } ...

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


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
Laravel или Symfony: что лучше для старта?
Wired 18.02.2025
В веб-разработке выбор правильного фреймворка может стать определяющим фактором успеха проекта. Особенно это актуально для PHP - одного из самых распространенных языков программирования, где Laravel. . .
Что нового в Laravel 12
Wired 18.02.2025
С момента своего появления в 2011 году Laravel постоянно развивается, внедряя инновационные решения и совершенствуя существующие возможности. В начале 2025 года ожидается выход Laravel 12 - новой. . .
Роутер в Laravel: как работать с маршрутами
Wired 18.02.2025
Маршрутизация - один из основополагающих элементов любого веб-приложения на Laravel, определяющий как приложение отвечает на HTTP-запросы к различным URL-адресам. По сути, роутинг - это механизм. . .
Интеграция шаблона Bootstrap в Laravel PHP
Wired 18.02.2025
Разработка веб-приложений в современном мире требует не только надежного бэкенда, но и привлекательного, отзывчивого интерфейса. Laravel, как один из самых популярных PHP-фреймворков, отлично. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru