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

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

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

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

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

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

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

Вызывая функцию rdbuf()-обращаемся к буферу чтения , хранящему символу. Вызывая функцию in_avail() этого буфера, хотим узнать , сколько в нем содержится символов. Это количество символов нужно удалить по идее
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru