Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814

Очистка потока

21.08.2016, 11:35. Показов 6197. Ответов 19

Студворк — интернет-сервис помощи студентам
Приветствую!

Есть метод класса, принимающий имя сотрудника (объект класса string) и его номер:

C++
1
2
3
4
5
6
7
8
9
void Employee::setData() {
    
    cout << "Введите имя: ";
    getline(cin, name);
    
    cout << "Введите ID сотрудника: ";
    cin >> ID;
 
}
Использую getline(), чтобы можно было ставить пробелы при вводе имени.

Далее в функции main() я делаю следующее:

C++
1
2
3
4
5
6
7
8
9
do {
 
    cout << endl << "Введите данные о работнике с номером " << i + 1 << endl;
    staff[i++].setData();
 
    cout << "Продолжить ввод данных? (y/n): ";
    cin >> answer;
 
} while (answer != 'n');
При этом из-за ввода ответа пользователем о продолжении работы, следующий ввод имени сотрудника работает некорректно (скриншот). Как исправить?
Миниатюры
Очистка потока  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2016, 11:35
Ответы с готовыми решениями:

Очистка потока
Так получается в программе, что приходится несколько раз открывать файл и закрывать, в ходе этого при очередном открытии файла в котором...

Очистка потока ввода
Собственно тема подымалась в интернете, но внятного объяснения я не получил. Для ввода строки с пробелами использую cin.getline() Если...

Очистка буфера потока
И снова здравствуйте, возникла снова проблема теперь уже иного рода. Есть код который заносит в поток значение: strm &lt;&lt;...

19
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.08.2016, 11:40
Лучший ответ Сообщение было отмечено Nishen как решение

Решение

Nishen, тынц.
1
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
21.08.2016, 11:56  [ТС]
gru74ik, спасибо большое!

Добавлено через 5 минут
А почему мне не помогает вариант с cin.sync()?

Пытаюсь сделать вот так:

C++
1
2
3
4
5
6
7
8
9
10
do {
 
    cout << endl << "Введите данные о работнике с номером " << i + 1 << endl;
    staff[i++].setData();
 
    cout << "Продолжить ввод данных? (y/n): ";
    cin >> answer;
    cin.sync();
        
} while (answer != 'n');
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.08.2016, 11:59
Nishen, весь свой код скинь.
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
21.08.2016, 12:03  [ТС]
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
//CHAPTER 7 - JOB_02
//main.cpp
 
#include <iostream>
#include <string>
 
using namespace std;
 
 
class Employee {
 
    private:
        string name;
        long ID;
 
    public:
        Employee();
        Employee(string n, long id);
        void setData();
        void setData(string n, long id);
        void setData(char n[], long id);
        void getData() const;
 
};
//-----------------------------------------------------------------------------
Employee::Employee() : name(""), ID(0) {
 
}
//-----------------------------------------------------------------------------
Employee::Employee(string n, long id) : name(n), ID(id) {
 
}
//-----------------------------------------------------------------------------
void Employee::setData() {
    
    cout << "Введите имя: ";
    getline(cin, name);
    
    cout << "Введите ID сотрудника: ";
    cin >> ID;
 
}
//-----------------------------------------------------------------------------
void Employee::setData(string n, long id) {
 
    name = n;
    ID = id;
 
}
//-----------------------------------------------------------------------------
void Employee::setData(char n[], long id) {
 
    int length = strlen(n);
 
    for (int i = 0; i < length; i++) {
 
        name[i] = n[i];
 
    }
 
    ID = id;
}
//-----------------------------------------------------------------------------
void Employee::getData() const {
 
    cout << "Сотрудник №" << ID << ". Имя: " << name;
 
}
 
 
 
int main() {
 
    setlocale(LC_ALL, "Russian");
 
    const int MAX = 100;
 
    Employee staff[MAX];
 
    int i = 0;
    char answer = 'y';
 
    do {
 
        cout << endl << "Введите данные о работнике с номером " << i + 1 << endl;
        staff[i++].setData();
 
        cout << "Продолжить ввод данных? (y/n): ";
        cin >> answer;
        cin.sync();
        
 
    } while (answer != 'n');
 
    for (int j = 0; j < i; j++) {
 
        staff[j].getData();
        cout << endl;
 
    }
 
    system("PAUSE");
    return 0;
 
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.08.2016, 12:13
Странно. У меня все работает нормально. Правда, я два заголовочника добавил:
C++
1
2
#include <cstdlib> // для system()
#include <cstring> // для strlen()
Миниатюры
Очистка потока  
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
21.08.2016, 12:16  [ТС]
gru74ik, а у Вас в цикле do-while используется функция sync()? Просто я сначала не тот вариант скопировал из IDE, потом исправил.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.08.2016, 12:25
Nishen, у меня так:
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
//CHAPTER 7 - JOB_02
//main.cpp
 
#include <iostream>
#include <string>
#include <cstdlib> // для system()
#include <cstring> // для strlen()
 
using namespace std;
 
 
class Employee {
 
    private:
        string name;
        long ID;
 
    public:
        Employee();
        Employee(string n, long id);
        void setData();
        void setData(string n, long id);
        void setData(char n[], long id);
        void getData() const;
 
};
//-----------------------------------------------------------------------------
Employee::Employee() : name(""), ID(0) {
 
}
//-----------------------------------------------------------------------------
Employee::Employee(string n, long id) : name(n), ID(id) {
 
}
//-----------------------------------------------------------------------------
void Employee::setData() {
 
    cout << "Введите имя: ";
    getline(cin, name);
 
    cout << "Введите ID сотрудника: ";
    cin >> ID;
 
}
//-----------------------------------------------------------------------------
void Employee::setData(string n, long id) {
 
    name = n;
    ID = id;
 
}
//-----------------------------------------------------------------------------
void Employee::setData(char n[], long id) {
 
    int length = strlen(n);
 
    for (int i = 0; i < length; i++) {
 
        name[i] = n[i];
 
    }
 
    ID = id;
}
//-----------------------------------------------------------------------------
void Employee::getData() const {
 
    cout << "Сотрудник №" << ID << ". Имя: " << name;
 
}
 
 
 
int main() {
 
    setlocale(LC_ALL, "Russian");
 
    const int MAX = 100;
 
    Employee staff[MAX];
 
    int i = 0;
    char answer = 'y';
 
    do {
 
        cout << endl << "Введите данные о работнике с номером " << i + 1 << endl;
        staff[i++].setData();
        cout << "Продолжить ввод данных? (y/n): ";
        cin >> answer;
        cin.sync();
 
    } while (answer != 'n');
 
    for (int j = 0; j < i; j++) {
 
        staff[j].getData();
        cout << endl;
 
    }
 
    system("PAUSE");
    return 0;
 
}
Добавлено через 5 минут
Nishen, а вообще, почему бы sync() не запихнуть прямо в функцию-член setData()?
C++
1
2
3
4
5
6
7
8
void Employee::setData() {
    cin.sync();
    cout << "Введите имя: ";
    getline(cin, name);
 
    cout << "Введите ID сотрудника: ";
    cin >> ID;
}
Тогда Вам не придётся заморачиваться с этим в мэйне. Ведь это, по сути, нюансы реализации. Пользователю не должно быть дела до того, как там класс устроен внутри.
1
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
21.08.2016, 12:27  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
почему бы sync() не запихнуть прямо в функцию-член setData
Да, спасибо за замечание. Но просто я использовал его изначально в метода setData(), он там не работал, я попробовал в main использовать его и так там и оставил. Странно, данный вариант решения проблемы на работает.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.08.2016, 07:23
Цитата Сообщение от Nishen Посмотреть сообщение
А почему мне не помогает вариант с cin.sync()?
ОС какая?
1
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
23.08.2016, 07:54
Цитата Сообщение от Nishen Посмотреть сообщение
Странно, данный вариант решения проблемы на работает.
Поведение sync зависит от реализации платформы. Он не обязан очищать поток.
ЕМНИП, в Windows с Visual Studio будет очищать, под Unix'ами не будет (во всех ли юниксах так ).
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
23.08.2016, 08:53
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
в Windows с Visual Studio будет очищать
Code::Blocks 16.01 + MinGW 4.9.2 + Windows 7 - очищает.

Добавлено через 14 минут
QtCreator 3.3.0 + MinGW 4.9.1 + Windows 7 - очищает.
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
23.08.2016, 10:15  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
ОС какая?
Windows 10 x64 Pro
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Windows с Visual Studio
Какая раз мой вариант, но не очищает.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.08.2016, 11:00
Цитата Сообщение от Nishen Посмотреть сообщение
Какая раз мой вариант, но не очищает.
В Windows должно работать. Студия какая?

Добавлено через 31 минуту
Цитата Сообщение от Nishen Посмотреть сообщение
Windows 10 x64 Pro
Сейчас проверил, в 10-ке не работает. Вывод: не использовать, для таких целей, sync(). Другие есть способы:
https://cppstudy.wordpress.com... et-and-co/
1
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
23.08.2016, 11:02  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Студия какая?
2015
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2016, 11:27
C++
1
2
3
4
5
6
void clear_input()
{
    std::wcin.clear(),
    std::wcin.ignore(std::numeric_limits<std::streamsize>::max(), L'\n');
    assert(std::wcin);
}
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.08.2016, 11:44
Цитата Сообщение от hoggy Посмотреть сообщение
std::wcin.ignore(std::numeric_limits<std ::streamsize>::max(), L'\n');
Лучше так:
C++
1
std::wcin.ignore((std::numeric_limits<std::streamsize>::max)(), L'\n');
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
23.08.2016, 11:48  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Лучше так:
Чем Ваша конструкция отличается от конструкции hoggy? Я вижу пару скобок, но что это даёт?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.08.2016, 11:51
Цитата Сообщение от Nishen Посмотреть сообщение
Я вижу пару скобок, но что это даёт?
Добавь в код #include <Windows.h> и посмотри, что будет без пары скобок.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2016, 12:05
Цитата Сообщение от nd2 Посмотреть сообщение
Лучше так:
синтаксический мусор

Цитата Сообщение от nd2 Посмотреть сообщение
Добавь в код #include <Windows.h> и посмотри, что будет без пары скобок.
C++
1
2
#define _NOMINMAX
#include <windows.h>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2016, 12:05
Помогаю со студенческими работами здесь

Очистка потока _getch()
Сетевая прога. getch() считывает клавишу пользователя, делает действие и переключается в состояние listening. И пока он слушает, не пришел...

Очистка потока ввода
ПОМОГИТЕ НАЙТИ ОШИБКУ Ребят написал малюсенький фрагмент кода, но уже есть ошибка. после того как вводим сh, почему то нельзя ввести...

Телефонный справочник. Очистка потока ввода
Доброго времени суток!!! Нужно сделать подобие телефонного справочника! Вот мой код: # include &lt;iostream&gt; # include...

Класс Person. Очистка потока ввода
Добрый вечер помогите найти ошибку в проге: задание : Разработайте класс Person, который содержит соответствующие элементы для...

Выполнение цикла. Очистка потока ввода
Добрый вечер. В данном коде тело цикла выполняется не n, а n-1 раз. Вернее, выполняется оно именно n раз, но почему-то 1ый раз команда...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru