Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
orange_fox
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
1

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

07.07.2014, 13:34. Просмотров 1276. Ответов 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) - нет.

Что делать?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 13:34
Ответы с готовыми решениями:

fflush(stdin)
В одной из ранее открытых тем, было сказано, что fllush(stdin) лучше не...

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

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

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

Эмуляция ОС Unix в Windows
Если честно, не знал, в какой раздел поместить тему. Поместил сюда....

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

Добавлено через 38 секунд
Цитата Сообщение от orange_fox Посмотреть сообщение
Что делать?
cin.ignore
0
orange_fox
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 13:38  [ТС] 3
Почему же она в винде чистит?
Можно пример кода с cin.ignore(), который чистил бы буфер в любой ситуации?
0
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:40 4
нужно внутренности потоков смотреть. начинка там сишная, потому и сработало, но это случайность.
0
uglyPinokkio
326 / 229 / 55
Регистрация: 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).
1
orange_fox
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 13:56  [ТС] 6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Эта функция работает только с потоками вывода.
Во всех остальных случаях ее поведение не определено.
Понял, спасибо. А что насчёт этого?
Цитата Сообщение от orange_fox Посмотреть сообщение
Можно пример кода с cin.ignore(), который чистил бы буфер в любой ситуации?
0
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
07.07.2014, 13:59 7
uglyPinokkio, а что у ТС из stdio.h используется , кроме fflush ?
0
orange_fox
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 14:12  [ТС] 8
Цитата Сообщение от MrCold Посмотреть сообщение
а что у ТС из stdio.h используется , кроме fflush ?
Ничего, был подключен ради fflush
0
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 14:17 9
Лучший ответ Сообщение было отмечено orange_fox как решение

Решение

Цитата Сообщение от orange_fox Посмотреть сообщение
Понял, спасибо. А что насчёт этого?
Про "любую ситуацию" не знаю, до конца потока:
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max())
Добавлено через 1 минуту
Цитата Сообщение от MrCold Посмотреть сообщение
а что у ТС из stdio.h используется , кроме fflush ?
В чем вопрос?
1
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 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')
1
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 15:20 11
C++
1
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
Это до конца строки.
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
07.07.2014, 16:41 12
uglyPinokkio, А ваш пример вообще не доведет до приглашения Input word2.
0
DrOffset
8123 / 4708 / 1149
Регистрация: 30.01.2014
Сообщений: 7,663
07.07.2014, 16:46 13
orange_fox, по поводу fflush совместно с С++ потоками - попробуй это.
0
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
07.07.2014, 16:54 14
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А ваш пример вообще не доведет до приглашения Input word2.
А где я утверждал обратное? Я сказал - чистит до конца потока.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
08.07.2014, 00:25 15
Цитата Сообщение от DrOffset Посмотреть сообщение
orange_fox, по поводу fflush совместно с С++ потоками - попробуй это.
Да они вроде и так синхронизированны по умолчанию.
0
08.07.2014, 00:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 00:25

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

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

Программа пропускает ввод данных несмотря на fflush
Доброго времени суток. Возникла проблема - когда я в первый раз в цикле ввожу...


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

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

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