Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
t_sidalv
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 7
1

Ошибки при работе с потоком ввода

15.04.2017, 01:42. Просмотров 168. Ответов 9
Метки нет (Все метки)

Есть функция:

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
void fillarr(airport *arr, int const N)
{
 
    for (int i = 0; i < N; i++)
    {
        cout << "==============================" << endl;
        cout << " - Номер рейса: ";
        cin.get(); 
        gets_s(arr[i].numflight);
 
        cout << " - Тип самолета: ";
        cin.get();
        gets_s(arr[i].airplane);
 
        cout << " - Пункт назначения: ";
        cin.get();
        gets_s(arr[i].destination);
 
        cout << " - Время вылета: ";
        cin.get();
        gets_s(arr[i].departuretime);
        cout << "==============================" << endl << endl;
    }
}
При выводе видно, первый введенный текст остается без изменений, а с последующими - нету первой буквы.

Помогите решить проблему. Весь интернет перелазил, пробовал, все равно фигня получается. Знаю, что там может использоваться cin.ignore() Прошу как можно понятнее объяснить эту функцию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2017, 01:42
Ответы с готовыми решениями:

Очистка буфера ввода при работе с cin
Добрый вечер! Пытаюсь научиться работать с классами, подскажите пожалуйста, что...

Ошибки при работе со строками
Доброго времени суток! Есть такой код #include &lt;stdio.h&gt; #include...

Ошибки при работе с шаблонами
Не могу понять в чем дело, вылазят вот такие ошибки: Ошибка 4 error LNK2019:...

Ошибки при работе с шаблонами
Всем привет. Пишу упрощенный List с использованием шаблонов. Но в итоге я...

Инициализировать вектор потоком ввода из консоли
Как вариант: int n; cin &gt;&gt; n; std::vector&lt;int&gt; a (n); Хочу: //...

9
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
15.04.2017, 01:57 2
cin.get()-ы убери. Там, где (до вызова этой функции) есть ввод через cin >>, делай аналогично этому:
C++
1
(cin >> n).get();
1
t_sidalv
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 7
15.04.2017, 11:28  [ТС] 3
nd2,

C++
1
(cin >> n).get();
Мне кажется, принцип работы этой записи тот же, который и у cin. Оно будет считывать до пробела/энтера. Мне нужно, чтобы считывало строку с пробелами и все получалось без ошибок
0
nmcf
6276 / 5578 / 2538
Регистрация: 14.04.2014
Сообщений: 23,468
15.04.2017, 11:36 4
Делай как говорят. Эта тема уже сто раз обсуждалась.
0
t_sidalv
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 7
15.04.2017, 11:47  [ТС] 5
nmcf, Я так и сделал. Считывает до пробела. Что стоит после пробела начинает записывать в последующие строки
0
nmcf
6276 / 5578 / 2538
Регистрация: 14.04.2014
Сообщений: 23,468
15.04.2017, 12:21 6
Показывай.
0
t_sidalv
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 7
15.04.2017, 12:42  [ТС] 7
Все, я разобрался, всем спасибо. Там через cin.getline() все чудесно работает.
Но есть одна фишка. Перед входом в функцию fillarr(airportArr, N) нужно прописать cin.get(), в противном случаи, оно пропустит ввод первой строки (Номер рейса). Почему так? Или это особенности switch?

Source:

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
32
33
int num;
    do {
        cout << "Print num: " << endl;
        cout << "0: EXIT" << endl;
        cout << "1: Task №1" << endl;
        cout << "2: Task №2" << endl;
        cout << "3: Task №3" << endl;
        cout << endl;
        cin >> num;
        cout << endl;
 
        int N;
 
        switch (num)
        {
        case 0:
            cout << "Goodbye" << endl;
            break;
        case 1:
        {
            airport *airportArr = NULL;
            cout << " Введите кол-во рейсов: ";
            cin >> N;
            airportArr = new airport[N];
 
                        cin.get();
 
            fillarr(airportArr, N);
            determinationwhichairplanes(airportArr, N);
 
            cout << endl;
            break;
        }
Функция fillarr:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void fillarr(airport *arr, int const N)
{
    for (int i = 0; i < N; i++)
    {
        cout << "==============================" << endl;
        cout << " - Номер рейса: ";
        cin.getline(arr[i].numflight, 20);
 
        cout << " - Тип самолета: ";
        cin.getline(arr[i].airplane, 20);
 
        cout << " - Пункт назначения: ";
        cin.getline(arr[i].destination, 20);
 
        cout << " - Время вылета: ";
        cin.getline(arr[i].departuretime, 8);
        cout << "==============================" << endl;
    }
    cout << endl;
    
}
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
15.04.2017, 12:44 8
Цитата Сообщение от t_sidalv Посмотреть сообщение
Почему так?
Потому что после ввода числа в потоке остается символ '\n'.
1
nmcf
6276 / 5578 / 2538
Регистрация: 14.04.2014
Сообщений: 23,468
15.04.2017, 13:11 9
В 9-й и 23-й строках делай как писал nd2, а 26-ю убрать.
1
t_sidalv
0 / 0 / 0
Регистрация: 02.10.2016
Сообщений: 7
15.04.2017, 13:22  [ТС] 10
Спасибо, все понял
0
15.04.2017, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2017, 13:22

Ошибки линковки при работе с DirectX
Создал DirectX проект, и решил разбить на файлы, создал render.cpp и main.cpp,...

Ошибки при работе с потоками Thread в c++
Здравствуйте, есть программа, совсем простая: #include &lt;iostream&gt; #include...

Ошибки компиляции при работе с OpenGL
Какую библиотеку нужно подключить и что нужно сделать, чтобы заработало: ...


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

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

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