rewind
Однако, в отличие от fseek этого, rewind очищает индикаторы ошибок для потока и индикатора конца файла. Кроме того, в отличие от fseek этого, rewind не возвращает значение, указывающее, был ли указатель успешно перемещен.
Чтобы очистить буфер клавиатуры, используйте rewind поток stdin , связанный с клавиатурой по умолчанию.
Если поток является NULL указателем, вызывается обработчик недопустимых параметров, как описано в разделе «Проверка параметров». Если выполнение разрешено продолжать, эта функция возвращается и errno имеет значение EINVAL .
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno , _doserrno _sys_errlist и _sys_nerr .
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью «Глобальное состояние» в CRT.
Требования
| Маршрут | Обязательный заголовок |
|---|---|
| rewind |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Библиотеки
Пример
// crt_rewind.c /* This program first opens a file named * crt_rewind.out for input and output and writes two * integers to the file. Next, it uses rewind to * reposition the file pointer to the beginning of * the file and reads the data back in. */ #include int main( void ) < FILE *stream; int data1, data2; data1 = 1; data2 = -37; fopen_s( &stream, "crt_rewind.out", "w+" ); if( stream != NULL ) < fprintf( stream, "%d %d", data1, data2 ); printf( "The values written are: %d and %d\n", data1, data2 ); rewind( stream ); fscanf_s( stream, "%d %d", &data1, &data2 ); printf( "The values read are: %d and %d\n", data1, data2 ); fclose( stream ); >>
Выходные данные
The values written are: 1 and -37 The values read are: 1 and -37
Как очистить буфер клавиатуры в c
Пользователь
Регистрация: 05.11.2009
Сообщений: 41
Очистка буфера ввода консоли
При вводе в буфере консоли остаётся мусор — последняя введенная строка. fflush(stdin) не помогает очистить.
Программа эмуляция бд — ввожу новую запись пять строк и одно число. Потом пытаюсь редактировать и в первый ввод scanf или gets попадает то что вводил до этого. Вроде проблему решило fseek(stdin, 0, SEEK_END) но я не понимаю почему так происходит?
Как очистить буфер клавиатуры в c
использую в тестовом примере ввод с клавиатуры с помощью scanf
printf("введите нужное:\n"); while (GoGo != 'q') < switch (GoGo): < case 's': . case '1': . > printf("введите нужное:\n"); >
читаю чары как %c, строку как %s, целое как %i, double как %lf
в общем, во внутреннем switch строка
printf("введите нужное:\n");
выводится ДВАЖДЫ .
т.е. видимо что-то остается в буфере!! сделал
fflush(stdin);
перед строкой printf — никакой разницы.
как победить сие безобразие . btw, под VC++6 и mingw все отлично.
P.S. компилятор g++/Linux.
—————
c уважением, мохнато-полосатый kot—
Re: про scanf и очистку буфера
| От: | kot— |
| Дата: | 15.05.07 10:54 |
| Оценка: |
Здравствуйте, kot—, Вы писали:
printf("введите нужное:\n"); while (GoGo != 'q') < switch (GoGo): < case 's': . case '1': . > printf("введите нужное:\n"); scanf("%c",&Gogo); >
да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.
—————
c уважением, мохнато-полосатый kot—
Re: про scanf и очистку буфера
| От: | Dair | https://dair.spb.ru |
| Дата: | 15.05.07 11:17 | |
| Оценка: |
K>вроде такого
K>
K> printf("введите нужное:\n"); K> while (GoGo != 'q') K> < K>switch (GoGo): K> < K>case 's': . K> case '1': . K> > K> printf("введите нужное:\n"); K> scanf("%c",&Gogo); K> > K>
K> как победить сие безобразие . btw, под VC++6 и mingw все отлично.
Я их вижу два (выделил в коде)
Удивлён
Может, как-нибудь так:
do < printf( "введите нужное:\n" ); scanf( "%c", &GoGo ); switch( GoGo ) < case 's': . case '1': . > > while( GoGo != 'q' );
Re[2]: про scanf и очистку буфера
| От: | Cruser |
| Дата: | 15.05.07 11:21 |
| Оценка: |
K> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.
scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает
Re[3]: про scanf и очистку буфера
| От: | kot— |
| Дата: | 15.05.07 11:28 |
| Оценка: |
Здравствуйте, Cruser, Вы писали:
K>> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.
C> scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает
хм. но разве fflush(stdin) буфер от него не чистит ?
—————
c уважением, мохнато-полосатый kot—
Re[4]: про scanf и очистку буфера
| От: | Cruser |
| Дата: | 15.05.07 13:07 |
| Оценка: |
Здравствуйте, kot—, Вы писали:
K>Здравствуйте, Cruser, Вы писали:
K>>> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.
C>> scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает
K> хм. но разве fflush(stdin) буфер от него не чистит ?
Чистит, с ним у меня scanf() нормально работает.
Re[4]: про scanf и очистку буфера
| От: | night beast |
| Дата: | 16.05.07 05:37 |
| Оценка: |
Здравствуйте, kot—, Вы писали:
K>>> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.
C>> scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает
K> хм. но разве fflush(stdin) буфер от него не чистит ?
если не ошибаюсь, fflush применим только для потоков вывода.
Очистка буфера ввода cin
Я только учу С++ и хочу сделать обработку неправильного введения пола друга. К примеру, пользователь вводит что-то кроме W и M и запрос на введение повторяется в цикле, что видно из кода. Также будет происходить, если пользователь введет много символов вместо одного. Но тут есть один момент. Дело в том, что так как тип переменной friend_sex char, то из потока ввода последовательность символов считывается посимвольно. Я написал abcd , допустим, но считалось сначала a , потом (если это в цикле, берется второй символ и происходит проверка, и так до конца). По сути, если написать abcMf , то на проверке четвертого символа цикл завершится, ибо проверка будет пройдена. Вопрос: Я хочу, чтобы при введение последовательности символов, считывался первый, а буфер ввода очищался от оставшихся. Посоветуйте, пожалуйста, функцию очистки буфера (cin.clear() не работает).