Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Чистка буфера, методы чистки буфера или как правильно? 
:(
    Опции темы
ressac
Дата 10.2.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



вообщем вот кодик...

Код

#include <stdio.h>
#define N 10
#define Q 9

main()
{
 int x;
 struct { char name[N]; int tlf; } usrs[Q];

 for(x=0;x<3;x++)
 {
  printf("\tintroduce user data\n.name: ");
  //gets(usrs[x].name);           //если будим считывать имена при помощи gets то нужно чистить буфер,  почему?
  scanf("%s",&usrs[x].name); // если при помощи scanf то не надо чистить буфер, сново - же  - почему?
  printf("\n.phone number: ");
  scanf("%i",&usrs[x].tlf);        
  system("cls");                       
  //scanf("%*c");                    // данная чистка ,  очишает лишь чаровые значения, а как - же для %i ?
  //while(getchar()!='\n');       // а эта чистит всё полностью , но "Так буфер чистить плохо. Представьте, что в буфере записан не один символ '\n', а два...", в винде всё ясно "fflush(stdin)", ну а в ЛИНУКСЕ как быть?
 }
 
 printf("\tlist of user data\n");
 for(x=0;x<3;x++)
 {
  printf("\n.name: ");
  puts(usrs[x].name);
  printf("\n.phone number: %i\n\n",usrs[x].tlf);
 }
system("pause");
}


в одном месте мне сказали что в *nix можно чистить ещё так...

fsync(STDOUT_FILENO); /* Для out */
fsync(STDIN_FILENO); /* Для in */


каким образом это работает, кто-то знает? приведите наглядный пример, плз. 
я побывал побывал, у меня так ничего не получилось smile
PM MAIL   Вверх
Sartorius
Дата 10.2.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

 // данная чистка ,  очишает лишь чаровые значения, а как - же для %i 



 это еще почему? Это парсятся они как чары.
PM MAIL ICQ   Вверх
ressac
Дата 10.2.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Sartorius, 
не совсем тебя понял...
PM MAIL   Вверх
Rockie
Дата 10.2.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(ressac @  10.2.2007,  11:06 Найти цитируемый пост)
 сново - же  - почему?

ressac, здесь:
Цитата(ressac @  10.2.2007,  11:06 Найти цитируемый пост)
 scanf("%i",&usrs[x].tlf);        

вводим число и нажимаем ввод. Нажатие на ввод равносильно '\n', но '\n' не может поместиться в usrs[x].tlf (так как считываем то целое число). Поэтому '\n' остается торчать в потоке и затем подхватывается 
Код

 //gets(usrs[x].name);  
gets определяет этот '\n' как окончание ввода и передает управление дальше
Код

#include <windows.h>
#include <stdio.h>
#define N 10
#define Q 9

main()
{
 int x, num = 2;
 struct { char name[N]; int tlf; } usrs[Q];

 for(x=0;x<num;x++)
 {
  printf("\tintroduce user data\n.name: ");
  gets(usrs[x].name);
  printf("\n.phone number: ");
  scanf("%i",&usrs[x].tlf);
  fflush(stdin);
 }                                 fsync

 system("cls");
 printf("\tlist of user data\n");

 for(x=0;x<num;x++)
 {
  printf("\n.name: ");
  puts(usrs[x].name);
  printf("\n.phone number: %i\n\n",usrs[x].tlf);
 }

 system("pause");
}


sync, fsync




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ressac
Дата 11.2.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Rockie,  ты пробывал компилить этот код ? 
PM MAIL   Вверх
Rockie
Дата 11.2.2007, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(ressac @  11.2.2007,  00:53 Найти цитируемый пост)
Rockie,  ты пробывал компилить этот код ? 

ressac, шутишь? конечно, я подправил твой если ты заметил. 
Аа, понятно. видать тебе компилятор выдает ошибку в 20-ой строке и поэтому ты так вежливо ответил.

Добавлено @ 02:39 
ressac, ну касаемо этой ошибки думаю нужно спросить Страуструпа, что-то явно не в порядке..




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ressac
Дата 11.2.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Rockie, 
smile
мне ошибку выдаёт лишь до тех пор пока там fsync , если я его удалю то всё пашет, но что ты там подправил кроме того что убрал комменты и поставил в fflush?

у  меня вопрос как чистить буфер в линуксе ? (и в винде без fflush.....)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата(Rockie @  10.2.2007,  20:30 Найти цитируемый пост)
ressac, здесь:
Цитата(ressac @  10.2.2007,  11:06 Найти цитируемый пост)
 scanf("%i",&usrs[x].tlf);        



если я нажму в место цифры на букву когда scanf("%i",&usrs[x].tlf);    будет ждать ввода то вся прога заглючит если конечно в конце FOR'а не будет чистки буфера вроде fflush'a так как scanf("%*c"); мне не поможет в этом случае. понимаешь о чём я ?

Добавлено @ 11:54 
и не понятно одно почему мне надо чистит буфер (не надо чистить потом что всё хорошо)  после scanf("%s",&usrs[x].name); а после gets(usrs[x].name);  нада, если она (gets) как тут говорят работают по одному и тому-же принципу что и scanf, читают до '\n'
PM MAIL   Вверх
vinter
Дата 11.2.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата
у  меня вопрос как чистить буфер в линуксе ? (и в винде без fflush.....)


а чем он тебе не угодил??
Цитата

если я нажму в место цифры на букву когда scanf("%i",&usrs[x].tlf);    будет ждать ввода то вся прога заглючит если конечно в конце FOR'а не будет чистки буфера вроде fflush'a так как scanf("%*c"); мне не поможет в этом случае. понимаешь о чём я ?

нет уж позвол, ты нажимай то, что требует программа, а не куда тыкнется..


--------------------
Мой блог
PM MAIL WWW   Вверх
ressac
Дата 11.2.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



vinter, 
ну зачем-же вопросами на вопрос smile отвечать.

не угодил он мне тем что он только в винде используется,.......

программа требует одно а пользователь которые  который будет её использовать может тыкнуть не то что надо...
PM MAIL   Вверх
vinter
Дата 11.2.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата
программа требует одно а пользователь которые  который будет её использовать может тыкнуть не то что надо...


тогда использование scanf плохая идея, тебе тогда посимвольно лучше читать..
Цитата
не угодил он мне тем что он только в винде используется,.......

разве?? это же не api функция.. с чего ты взял, что она только в винде используется??


--------------------
Мой блог
PM MAIL WWW   Вверх
ressac
Дата 12.2.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



vinter, я не спец , я новичок, я побывал использывать её в линуксе, она там не работала smile 

а что насчёт посимвольно, тогда это совсем другое дело в том-то и дело что хочу узнать как ос сканф-ом и гет-сом быть smile вот так smile

PM MAIL   Вверх
threef
Дата 12.2.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Я так понял, что тебе нужно проверить правильность(валидность) ввода, и ты пытаешься, в случае ошибки, очистить буфер, определить ошибку и т.п. Думаю, проще ввести полную строку и потом пытаться ее разобрать.
PM MAIL   Вверх
ressac
Дата 13.2.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



threef, нет, мне нада просто чистит БУФЕР smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.