Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
1

Cin перестал читать из потока ввода

15.02.2018, 13:40. Просмотров 851. Ответов 4
Метки нет (Все метки)

Возникла проблема при чтении из потока.
Может кто знает, как решить эту проблему с cin?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <iomanip>
#include <vector>
#include <algorithm>
 
#define SIZE 20
using namespace std;
 
 
struct ORDER {
 
    char lpszNumber_1[ SIZE + 1];
    char lpszNumber_2[SIZE + 1];
    float fSum;
 
};
 
bool comp(ORDER arg_1,   ORDER arg_2)
{
 
    return  ( strcmp( arg_2.lpszNumber_1, 
            
        arg_1.lpszNumber_1) > 0 ) ;
}
 
 
 
vector<ORDER> Input( void  ) 
{
 
    vector<ORDER>mass;
    while (1)
    {
 
        char buff[50];
        cin.get(buff, sizeof(buff) - 1);
        cin.get();
        if (strcmp(buff, "") == 0)
        {
            break;
        }
        
        ORDER temp;
        if (3 != sscanf(buff, "%s %s %f", temp.lpszNumber_1, temp.lpszNumber_2, &temp.fSum))
        {
            cout << "Неверный ввод!\n";
            continue;
        }
        
        mass.push_back(temp);
        
        //qsort( &mass[0], mass.size(), sizeof(ORDER), comp);
        sort( mass.begin(), mass.end(), comp);
 
    }
    return mass;
}
 
void GetInfo( vector<ORDER>mass, char string[] )
{
    bool flag = false;
    while (mass.size() > 0)
    {
        ORDER temp = mass[  mass.size() - 1];
        if (strcmp(temp.lpszNumber_1, string) == 0)
        {
            cout << "Сумма, снятая этим плательщиком: " << temp.fSum<<endl;
        }
        mass.pop_back();
 
    }
    if (!flag)
    {
        cout << "Таких расчётных счетов нет!\n";
    }
}
 
 
int main( void )
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
 
    int count;
    cout << "Вводите даееые.\n«Номер плательщика Номер получателя Сумма»\nВвод пустой строки - конец ввода.\n";
 
    vector<ORDER>mass(Input());
 
    for (int i = 0; i < mass.size() ; i++)
    {
        cout <<left<< setw( 20 )<<mass[i].lpszNumber_1 << " " << setw(20)<<mass[i].lpszNumber_2 <<" "<<right<< mass[i].fSum <<" рублей"<< endl;
    }
    cout << "Введите расчётный счёт плательщика: ";
 
 /*--------- здесь уже не читает-------------*/
    
    char buff[21];
 
    cin.get(buff, sizeof(buff) - 1, '\n');
 
    GetInfo(mass, buff);
    
    system("pause");
    return 0;
}
Добавлено через 31 минуту
Вообще непонятно.
C++
1
2
3
4
5
6
7
 char buff[50];
        cin.get(buff, sizeof(buff) - 1);
        cin.get();
        if (strcmp(buff, "") == 0)
        {
            break;
        }
Здесь я считыва символы в массив( при этом в потоке остаётся символ перевода строки )
Его я извлекаю. Дальше в цикле всё нормально выполняется и записывается, а вот после ввода пустой строки и выхода из цикла уже cin никак не хочет читать ничего. Даже интересно что в потоке сидит.
Ну не eof точно

Добавлено через 1 час 19 минут
Короче, да EOF. При этом при вводе пустой строки
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2018, 13:40
Ответы с готовыми решениями:

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

Работа с cin при считывании с потока ввода
есть кусочек кода while (1) { string buf = name; cout &lt;&lt; &quot;Message : &quot;; string...

Использование потока cin для ввода символов
Вот первая функция, cin.get(ch) которую я не понимаю int main() { char ch; cin.get(ch);...

читать пробел cin ом
Возможно, глупый вопрос, но как считать cinом строчку с пробелом? Желательно в массив char

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые...

4
igorrr37
2042 / 1606 / 800
Регистрация: 21.12.2010
Сообщений: 2,751
Записей в блоге: 10
15.02.2018, 13:43 2
C++
1
2
3
cin.get(buff, sizeof(buff));
cin.clear();
cin.get();
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
15.02.2018, 14:10  [ТС] 3
igorrr37, все равно потом поток читать не хочет

Добавлено через 2 минуты
igorrr37, я из потоку беру строку, до символа перевода строки. Сам символ вытаскиваю get без параметров, но в случае если я ничего не вввожу( пустая строка ) то дальше у меня в потоке сидит eof и всё. Капут

Добавлено через 6 минут
igorrr37, в общем, как мне завершить ввод строк, при этом чтоб в потоке не сидел eof, используя только методы cin. Можете подсказать?

Добавлено через 7 минут
Бред какой-то, мне eof можно как-нибудь сбросить потом? Или ничего не сделаешь?
0
igorrr37
2042 / 1606 / 800
Регистрация: 21.12.2010
Сообщений: 2,751
Записей в блоге: 10
15.02.2018, 14:19 4
Лучший ответ Сообщение было отмечено Michail97 как решение

Решение

когда вводишь пустую строку то cin.get(buff, sizeof(buff)); ничего не читает оставляя в потоке символ перевода строки и выставляя флаг failbit. Поэтому сперва надо сбросить флаг через cin.clear(), потом считать перевод строки, а уж потом можно читать свежие данные
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
15.02.2018, 18:27  [ТС] 5
igorrr37, вы мой спаситель. А то в си вообще было просто с потоками ввода, а тут ещё и флаги для него надо менять в случае обычного ввода пустой строки.
0
15.02.2018, 18:27
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2018, 18:27

Возобновление потока cin.
Всем привет =) С недавних пор изучаю С++, и вот однажды, во время выполнения одного из заданий из...

Проблемы со сбросом потока cin.clear()
Всем привет. Столкнулся с такой проблемой и до сих пор не смог ее решить. Имеется следующая задача....

Поместить данные в буфер потока cin
Здравствуйте. Поправьте, если ошибаюсь в терминах. Нужно эмулировать ввод слова в объект istream,...


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

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

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