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

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

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

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

07.07.2014, 13:34. Просмотров 994. Ответов 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, уже stdout
if (feof(stdin)) while(!feo(stdin)) while(!feof(stdin) ) C++
Эмуляция ОС Unix в Windows C++
fflush(stdin) C++
Программы не работают на Windows 7 C++
C++ Почему одинаковые коды работают по разному?
C++ stdin
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
852 / 750 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:38     Fflush(stdin) по-разному работают в unix и windows #2
Цитата Сообщение от orange_fox Посмотреть сообщение
fflush(stdin); // Эта команда, по-идее, должна очистить буфер
С чего она должна чистить буфер тут плюсовые потоки, а не сишные.

Добавлено через 38 секунд
Цитата Сообщение от orange_fox Посмотреть сообщение
Что делать?
cin.ignore
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 13:38  [ТС]     Fflush(stdin) по-разному работают в unix и windows #3
Почему же она в винде чистит?
Можно пример кода с cin.ignore(), который чистил бы буфер в любой ситуации?
MrCold
852 / 750 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:40     Fflush(stdin) по-разному работают в unix и windows #4
нужно внутренности потоков смотреть. начинка там сишная, потому и сработало, но это случайность.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 13:44     Fflush(stdin) по-разному работают в unix и windows #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  [ТС]     Fflush(stdin) по-разному работают в unix и windows #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Эта функция работает только с потоками вывода.
Во всех остальных случаях ее поведение не определено.
Понял, спасибо. А что насчёт этого?
Цитата Сообщение от orange_fox Посмотреть сообщение
Можно пример кода с cin.ignore(), который чистил бы буфер в любой ситуации?
MrCold
852 / 750 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:59     Fflush(stdin) по-разному работают в unix и windows #7
uglyPinokkio, а что у ТС из stdio.h используется , кроме fflush ?
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 14:12  [ТС]     Fflush(stdin) по-разному работают в unix и windows #8
Цитата Сообщение от MrCold Посмотреть сообщение
а что у ТС из stdio.h используется , кроме fflush ?
Ничего, был подключен ради fflush
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 14:17     Fflush(stdin) по-разному работают в unix и windows #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от orange_fox Посмотреть сообщение
Понял, спасибо. А что насчёт этого?
Про "любую ситуацию" не знаю, до конца потока:
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max())
Добавлено через 1 минуту
Цитата Сообщение от MrCold Посмотреть сообщение
а что у ТС из stdio.h используется , кроме fflush ?
В чем вопрос?
Kerry_Jr
Модератор
Эксперт PHP
2142 / 1938 / 677
Регистрация: 14.05.2014
Сообщений: 5,681
Записей в блоге: 1
Завершенные тесты: 5
07.07.2014, 15:17     Fflush(stdin) по-разному работают в unix и windows #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     Fflush(stdin) по-разному работают в unix и windows #11
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
Это до конца строки.
Kerry_Jr
Модератор
Эксперт PHP
2142 / 1938 / 677
Регистрация: 14.05.2014
Сообщений: 5,681
Записей в блоге: 1
Завершенные тесты: 5
07.07.2014, 16:41     Fflush(stdin) по-разному работают в unix и windows #12
uglyPinokkio, А ваш пример вообще не доведет до приглашения Input word2.
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
07.07.2014, 16:46     Fflush(stdin) по-разному работают в unix и windows #13
orange_fox, по поводу fflush совместно с С++ потоками - попробуй это.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 16:54     Fflush(stdin) по-разному работают в unix и windows #14
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А ваш пример вообще не доведет до приглашения Input word2.
А где я утверждал обратное? Я сказал - чистит до конца потока.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 00:25     Fflush(stdin) по-разному работают в unix и windows
Еще ссылки по теме:

C++ std::fflush(stdin);
Реализация команд Unix в ОС Windows C++
C++ Программа пропускает ввод данных несмотря на fflush
C++ Неожиданное поведение fflush(), неправильная работа функции
Реализация UNIX команды "cat" в консоли Windows с использованием WinAPI C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
08.07.2014, 00:25     Fflush(stdin) по-разному работают в unix и windows #15
Цитата Сообщение от DrOffset Посмотреть сообщение
orange_fox, по поводу fflush совместно с С++ потоками - попробуй это.
Да они вроде и так синхронизированны по умолчанию.
Yandex
Объявления
08.07.2014, 00:25     Fflush(stdin) по-разному работают в unix и windows
Ответ Создать тему
Опции темы

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