Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
#1

Fflush(stdin) по-разному работают в unix и windows - C++

07.07.2014, 13:34. Просмотров 1059. Ответов 14
Метки нет (Все метки)

Собственно, код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
    char word1[20], word2[20];
    cout << "Input word1: " << endl;
    cin >> word1; //Если ввести два слова, вместо одного, то второе слово остаётся лежать в буфере
    fflush(stdin); // Эта команда, по-идее, должна очистить буфер
    cout << "Input word2: " << endl;
    cin >> word2; // Чтобы можно было ручками ввести второе слово, а не брать его из буфера
    cout << "Thank you for your words: " << word1 << ", " << word2 << endl;
    return 0;
}
В windows буфер очищается:
Fflush(stdin) по-разному работают в unix и windows
А в linux - нет
Fflush(stdin) по-разному работают в unix и windows

В этом случае я вместо fflush(stdin) могу использовать while(cin.get() != '\n'), чтобы удалить все оставшиеся в буфере символы, включая '\n'. Но, если буфер будет пустым, то команда while(cin.get() != '\n') "заставит" пользователя что-то ввести, а fflush(stdin) - нет.

Что делать?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 13:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Fflush(stdin) по-разному работают в unix и windows (C++):

fflush(stdin) - C++
В одной из ранее открытых тем, было сказано, что fllush(stdin) лучше не использовать. Чем можно заменить эту функцию?

std::fflush(stdin); - C++
std::fflush(stdin); что делает эта функция?

Почему одинаковые коды работают по разному? - C++
Всем привет! У меня довольно необычная проблема. Суть её в том, что я написал программу по аналогии с чужой программой. Однако несмотря...

if (feof(stdin)) while(!feo(stdin)) while(!feof(stdin) ) - C++
Как с ними правильно работать в Си?? Объясните принцип пожалуйста?

Эмуляция ОС Unix в Windows - C++
Если честно, не знал, в какой раздел поместить тему. Поместил сюда. Подскажите, как написать эмулятор Unix (командную строку), чтобы он...

Реализация команд Unix в ОС Windows - C++
Здравствуйте, уважаемые пользователи. Столкнулся вот с такой задачей: &quot;Написать эмулятор команд ОС Unix в Windows&quot;. Суть такова: ввожу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrCold
854 / 752 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:38 #2
Цитата Сообщение от orange_fox Посмотреть сообщение
fflush(stdin); // Эта команда, по-идее, должна очистить буфер
С чего она должна чистить буфер тут плюсовые потоки, а не сишные.

Добавлено через 38 секунд
Цитата Сообщение от orange_fox Посмотреть сообщение
Что делать?
cin.ignore
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 13:38  [ТС] #3
Почему же она в винде чистит?
Можно пример кода с cin.ignore(), который чистил бы буфер в любой ситуации?
MrCold
854 / 752 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:40 #4
нужно внутренности потоков смотреть. начинка там сишная, потому и сработало, но это случайность.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 13:44 #5
Цитата Сообщение от orange_fox Посмотреть сообщение
Fflush(stdin) по-разному работают в unix и windows
http://www.cplusplus.com/reference/cstdio/fflush/

Эта функция работает только с потоками вывода.
Во всех остальных случаях ее поведение не определено.


If the given stream was open for writing (or if it was open for updating and the last i/o operation was an output operation) any unwritten data in its output buffer is written to the file.

If stream is a null pointer, all such streams are flushed.

In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 13:56  [ТС] #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Эта функция работает только с потоками вывода.
Во всех остальных случаях ее поведение не определено.
Понял, спасибо. А что насчёт этого?
Цитата Сообщение от orange_fox Посмотреть сообщение
Можно пример кода с cin.ignore(), который чистил бы буфер в любой ситуации?
MrCold
854 / 752 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:59 #7
uglyPinokkio, а что у ТС из stdio.h используется , кроме fflush ?
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 14:12  [ТС] #8
Цитата Сообщение от MrCold Посмотреть сообщение
а что у ТС из stdio.h используется , кроме fflush ?
Ничего, был подключен ради fflush
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 14:17 #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от orange_fox Посмотреть сообщение
Понял, спасибо. А что насчёт этого?
Про "любую ситуацию" не знаю, до конца потока:
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max())
Добавлено через 1 минуту
Цитата Сообщение от MrCold Посмотреть сообщение
а что у ТС из stdio.h используется , кроме fflush ?
В чем вопрос?
Kerry_Jr
Модератор
Эксперт PHP
2184 / 1980 / 692
Регистрация: 14.05.2014
Сообщений: 5,788
Записей в блоге: 1
Завершенные тесты: 5
07.07.2014, 15:17 #10
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
cin.ignore(std::numeric_limits<std::streamsize>::max())
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 15:20 #11
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
Это до конца строки.
Kerry_Jr
Модератор
Эксперт PHP
2184 / 1980 / 692
Регистрация: 14.05.2014
Сообщений: 5,788
Записей в блоге: 1
Завершенные тесты: 5
07.07.2014, 16:41 #12
uglyPinokkio, А ваш пример вообще не доведет до приглашения Input word2.
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
07.07.2014, 16:46 #13
orange_fox, по поводу fflush совместно с С++ потоками - попробуй это.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 16:54 #14
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А ваш пример вообще не доведет до приглашения Input word2.
А где я утверждал обратное? Я сказал - чистит до конца потока.
gray_fox
What a waste!
1507 / 1210 / 68
Регистрация: 21.04.2012
Сообщений: 2,545
Завершенные тесты: 3
08.07.2014, 00:25 #15
Цитата Сообщение от DrOffset Посмотреть сообщение
orange_fox, по поводу fflush совместно с С++ потоками - попробуй это.
Да они вроде и так синхронизированны по умолчанию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 00:25
Привет! Вот еще темы с ответами:

Опять про fflush, уже stdout - C++
Уважаемые профессионалы. В книге Хэзфилд, Кирби &quot; Искусство программирования на языке Си. Фундаментальные алгоритмы.... &quot; на 58 стр. увидел...

Программа пропускает ввод данных несмотря на fflush - C++
Доброго времени суток. Возникла проблема - когда я в первый раз в цикле ввожу текст посимвольно с помощью getchar, то все нормально. Однако...

Неожиданное поведение fflush(), неправильная работа функции - C++
Никак не пойму почему код не хочет работать последовательно, так, как я ему указал.Что не так я делаю с fflush? Функция запрашивает лишь...

Альтернатива fflush(stdin); под пингвином - C Linux
Собственно, у меня была трабла со scanf , в кратце так вводился символ+ентер, а надо было просто что бы символ. Придумали использовать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.07.2014, 00:25
Ответ Создать тему
Опции темы

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