Поскольку я обнаружил, что fflush(stdin)
не является переносимым способом решения знакомой проблемы "новой строки, скрывающейся во входном буфере", я использовал следующее, когда должен использовать scanf
:
while((c = getchar()) != '\n' && c != EOF);
Но сегодня я наткнулся на эту строку, которую я заметил на cplusplus.com на fflush< /а>:
fflush()... в файлах, открытых для обновления (т. е. открытых как для чтения, так и для записи), поток должен очищаться после операции вывода перед выполнением операции ввода. Это можно сделать либо перепозиционированием (fseek, fsetpos, перемотка назад), либо явным вызовом fflush
На самом деле, я читал это раньше много раз. Поэтому я хочу подтвердить, могу ли я просто использовать что-либо из следующего перед scanf()
для той же цели, что и fflush(stdin)
, когда он поддерживается:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
PS rewind(stdin)
кажется довольно безопасным и пригодным для очистки буфера, я ошибаюсь?
Ошибка Я должен был упомянуть fseek(stdin,0,SEEK_SET)
, если мы говорим о stdin
, поскольку в этом случае мы не можем использовать никакое смещение, кроме 0 или сдвига, возвращаемого ftell()
.
stdin
, чтобы потребоватьfflush(stdin)
? Это кажется глупым! Вы хотите записывать в поток только для чтения?! Почему бы вам не описать, что вы подразумеваете под очисткой буфера или что вы хотите, чтобыfflush(stdin)
делал? Вы также можете рассмотреть, что на самом деле делаетfflush
согласно руководству, отличному от C++< /а>. Ведь это С, а не С++... - person autistic   schedule 21.05.2013stdin
в частности. Я имел в виду, что при чтении изstdin
, согласно этому абзацу, мы могли бы очистить его, используя для негоrewind()
илиfseek()
. - person Jugni   schedule 21.05.2013stdin
открыт только для чтения, а не для обновления (как для чтения, так и для записи). Не путайте эти два режима. Это не редкость для этого сайта, чтобы быть грубо неточным. Найдите другой сайт с руководствами. Я рекомендую открытую группу. - person autistic   schedule 21.05.2013stdin
. Я имею в виду, что если от предыдущей клавиши Enter осталась новая строка, то почему мы не можем использовать для нееfseek()
иrewind()
( чтобы сбросить его). Вы хотите сказать, что stdin недоступен для поиска? Это так? - person Jugni   schedule 21.05.2013fflush
вызывает запись данных. Нажмите на ссылку в моем первом комментарии, и вы увидите это. Существует три режима доступа: открыть для чтения, открыть для записи и открыть для обновления. Что вы подразумеваете под сбросить? Определите этот процесс, не используя слово flush (потому что это тарабарщина), и вы увидите, что поиск не может вам сильно помочь, даже если файл доступен для поиска. - person autistic   schedule 22.05.2013scanf("%*[^\n]"); getchar();
может помочь вам прочитать и отбросить остаток строки? - person autistic   schedule 22.05.2013