С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

04.05.2013, 18:20. Просмотров 805. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зацикливание программы при вводе (C++):

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

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

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

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

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? - C++
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; } ...

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

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

Вызывая функцию rdbuf()-обращаемся к буферу чтения , хранящему символу. Вызывая функцию in_avail() этого буфера, хотим узнать , сколько в нем содержится символов. Это количество символов нужно удалить по идее
1
04.05.2013, 19:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 19:01
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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