Discussion:
jak wyczyscić bufor stdin w C
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
kamyczek
2004-06-03 09:04:59 UTC
Permalink
mam taki problem :(

while(scanf("%c",&wybor)!='1') {
...
}

nie postrafie wyczyscic bufora.
Prosze pilnie o pomoc.
t***@bsod.org
2004-06-03 09:15:37 UTC
Permalink
Post by kamyczek
while(scanf("%c",&wybor)!='1') {
...
}
fflush(stdin);
--
Jacek Pospychala
***@bsod.org http://tri10o.republika.pl
Marcin 'Qrczak' Kowalczyk
2004-06-03 09:30:53 UTC
Permalink
Post by t***@bsod.org
fflush(stdin);
Bzdura.

man fflush

OPIS
Funkcja fflush wymusza zapis wszystkich buforowanych
danych dla danego strumienia *wyjściowego* [...]
--
__("< Marcin Kowalczyk
\__/ ***@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
kamyczek
2004-06-03 09:39:27 UTC
Permalink
Post by Marcin 'Qrczak' Kowalczyk
Post by t***@bsod.org
fflush(stdin);
Bzdura.
man fflush
OPIS
Funkcja fflush wymusza zapis wszystkich buforowanych
danych dla danego strumienia *wyjściowego* [...]
...no własnie fflush nie działa :(
Piotr Sietnik
2004-06-03 10:12:09 UTC
Permalink
Post by kamyczek
...no własnie fflush nie działa :(
Odczytaj wszystko i zignoruj.
--
Piotr Sietnik
***@pk.mofnet.gov.pl
kamyczek
2004-06-03 10:20:16 UTC
Permalink
Post by Piotr Sietnik
Post by kamyczek
...no własnie fflush nie działa :(
Odczytaj wszystko i zignoruj.
Program sam odczytuje wszystko .... nie wiem jak zignorowac pozostałe znaki
Piotr Sietnik
2004-06-03 11:49:44 UTC
Permalink
Post by kamyczek
Program sam odczytuje wszystko ....
Jeśli program odczytuje wszystko, to bufor powinien być pusty. :)
Post by kamyczek
nie wiem jak zignorowac pozostałe
znaki
Odczytać i zapomnieć.

Przyjrzałem się pierwszemu Twojemu pytaniu i w związku z tym
ja Ciebie zapytam po co czytasz scanfem jednen znak?
Do tego jest getchar.
--
Piotr Sietnik
***@pk.mofnet.gov.pl
kamyczek
2004-06-03 12:00:46 UTC
Permalink
Post by Piotr Sietnik
Post by kamyczek
Program sam odczytuje wszystko ....
Jeśli program odczytuje wszystko, to bufor powinien być pusty. :)
Post by kamyczek
nie wiem jak zignorowac pozostałe
znaki
Odczytać i zapomnieć.
Przyjrzałem się pierwszemu Twojemu pytaniu i w związku z tym
ja Ciebie zapytam po co czytasz scanfem jednen znak?
Do tego jest getchar.
Ale gdy czytam getchar() to rowzniez pozostałe znaki zostają zapamietane w
buforze .... i gdy pojawia sie nastepne wywołanie scnaf czy getchar ...to
funkcje otrzymują znaki z bufora.
Marcin 'Qrczak' Kowalczyk
2004-06-03 12:15:22 UTC
Permalink
Post by kamyczek
Ale gdy czytam getchar() to rowzniez pozostałe znaki zostają zapamietane w
buforze .... i gdy pojawia sie nastepne wywołanie scnaf czy getchar ...to
funkcje otrzymują znaki z bufora.
Buforowaniem linii standardowego wejścia zajmuje się system operacyjny.
Pojęcie "wyczyszczenie bufora" nie ma sensu; jeśli wejście jest
przekierowane z pliku, to w buforze będzie co innego, niż jeśli
wejście jest z klawiatury. Bufor w programie też nie ma nic do rzeczy,
bo może zawierać kawałek linii.

Chcesz może usunąć znaki aż do końca linii? Jeśli tak, to właśnie
to zrób: czytaj znak po znaku, aż nie dostaniesz znaku końca linii
albo nie dojdziesz do końca pliku.
--
__("< Marcin Kowalczyk
\__/ ***@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
kamyczek
2004-06-03 12:59:52 UTC
Permalink
Post by Marcin 'Qrczak' Kowalczyk
Post by kamyczek
Ale gdy czytam getchar() to rowzniez pozostałe znaki zostają zapamietane
w buforze .... i gdy pojawia sie nastepne wywołanie scnaf czy getchar
...to funkcje otrzymują znaki z bufora.
Buforowaniem linii standardowego wejścia zajmuje się system operacyjny.
Pojęcie "wyczyszczenie bufora" nie ma sensu; jeśli wejście jest
przekierowane z pliku, to w buforze będzie co innego, niż jeśli
wejście jest z klawiatury. Bufor w programie też nie ma nic do rzeczy,
bo może zawierać kawałek linii.
Chcesz może usunąć znaki aż do końca linii? Jeśli tak, to właśnie
to zrób: czytaj znak po znaku, aż nie dostaniesz znaku końca linii
albo nie dojdziesz do końca pliku.
oj :(
Ten kawałek programu to ma byc menu .....
tzn. chce pobierac jedna cyfre ktora decyduje o tym jaką pozycje z menu
wybieram. Tyle ze po wybroaniu z tego menu ma pokazac sie nastepne ....
i gdy wpisuje 2[enter] to on z pierwszego menu wybiera pozycje 2 a dla
drugiego scanf("%c",&wybor) pobiera automatycznie [enter] przez co powoduje
wybranie default i wyswietlenie ponownie menu


To jest pierwsze menu ....
do {
menu();

scanf("%c",&wybor);
switch (wybor) {
case '1': czytajmiasto(lista);
break;
case '2':fflush(stdin);
wpiszrecznie(lista);
break;
case '3': if (lista->rozmiar > 0 )
wyswietl(lista);
else
printf("Brak miast na liscie komiwojazera");
break;
case '4':if (lista->rozmiar > 0 ) {
sciezka(lista, lista->glowa->miasto,droga);
wyswietl(droga);
}
else
printf("Brak miast na liscie komiwojazera");
break;
case '5':usunDroge(droga);
usunListe(lista);
printf("Dziekujemy za skorzystanie z programu\n");
break;
default : printf("Wybierz z menu od 1 do 5\n");
break;
}
}
while (wybor != '5');


a to drugie
do{
printf("1 - Chce recznie wpisywac nazwy miast i wspolrzedne\n");
printf("2 - Chce pobierac nazwy miast z pliku, a wspolrzedne wpisywac
samodzielnie\n");


scanf("%c",&wybor);
switch (wybor) {
case '1': wpiszmiasto(lista);
break;
case '2': tylkowspol(lista);
break;
}
}
while (wybor !='1' && wybor !='2');
Marcin 'Qrczak' Kowalczyk
2004-06-03 13:00:02 UTC
Permalink
Post by kamyczek
tzn. chce pobierac jedna cyfre ktora decyduje o tym jaką pozycje z menu
wybieram. Tyle ze po wybroaniu z tego menu ma pokazac sie nastepne ....
i gdy wpisuje 2[enter] to on z pierwszego menu wybiera pozycje 2 a dla
drugiego scanf("%c",&wybor) pobiera automatycznie [enter] przez co powoduje
wybranie default i wyswietlenie ponownie menu
A co ma się stać, jeśli ktoś wpisze 2345[enter] albo 2xyz[enter]?

W ogóle nie będę się powtarzał: już pisałem, co można zrobić,
jeśli chcesz uzyskać akurat taki efekt.
--
__("< Marcin Kowalczyk
\__/ ***@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
kamyczek
2004-06-03 13:34:22 UTC
Permalink
Post by Marcin 'Qrczak' Kowalczyk
Post by kamyczek
tzn. chce pobierac jedna cyfre ktora decyduje o tym jaką pozycje z menu
wybieram. Tyle ze po wybroaniu z tego menu ma pokazac sie nastepne ....
i gdy wpisuje 2[enter] to on z pierwszego menu wybiera pozycje 2 a dla
drugiego scanf("%c",&wybor) pobiera automatycznie [enter] przez co
powoduje wybranie default i wyswietlenie ponownie menu
A co ma się stać, jeśli ktoś wpisze 2345[enter] albo 2xyz[enter]?
W ogóle nie będę się powtarzał: już pisałem, co można zrobić,
jeśli chcesz uzyskać akurat taki efekt.
gdy ktos wpisze 2345[enter] ma sie tylko wybrać z pierwszego menu 2 pozycja
.... prosze powtorz dla mnie jeszcze raz ... prosze
marcin lewandowski
2004-06-25 17:36:56 UTC
Permalink
Post by Marcin 'Qrczak' Kowalczyk
W ogóle nie będę się powtarzał: już pisałem, co można zrobić,
jeśli chcesz uzyskać akurat taki efekt.
jak dla mnie to jest cos popieprzone w samej ideologii dzialania twojego
menu. moze sproboj brac pod uwage ostatni znak ktory odczytasz z stdin?
ale to juz chyba trzeba selectem sprawdzac czy cos tam jeszcze czeka...

m.

t***@bsod.org
2004-06-04 12:43:14 UTC
Permalink
Ten wpis może być nieodpowiedni. Kliknij, aby go wyświetlić.
Marcin 'Qrczak' Kowalczyk
2004-06-04 13:41:16 UTC
Permalink
Post by t***@bsod.org
setbuf(stdin,NULL)
o ile rozumiem, po tym stdin przejdzie w tryb unbuffered, a potem
przy pierwszym lepszym odczycie z stdin, system znowu zalozy mu bufor?
Nie, bo jest też bufor po stronie jądra. Jeśli proces zrobi
read(fd, buf, N), a z poprzedniej linii nic nie zostało do wczytania,
to jądro wczyta całą linię, a procesowi przekaże tylko pierwsze N
bajtów. Gdyby nawet pozbyć się tego, co zbuforował sobie proces,
to efekt będzie dość arbitralny, zależny od tego, ile biblioteka C
sobie wewnętrznie buforuje.

Jeszcze gorzej będzie, jeśli wejście jest przekierowane z pliku.
Wtedy read() może zwrócić więcej niż jedną linię, więc w prywatnym
buforze procesu są dane, których nie chcemy wyrzucać.

Tu nie chodzi o bufor. To jest źle postawiony problem. Traktujmy wejście
jako ciąg znaków, być może pochodzący z klawiatury. Użytkownik wpisał
jakieś znaki, potem wcisnął Enter. Musimy coś z tymi wszystkimi znakami
przed Enterem zrobić, a może być ich dowolnie dużo. Być może chcemy
je zignorować, może zinterpretować jako kolejne instrukcje mimo braku
Entera między nimi, a może powiedzieć użytkownikowi, że dziwne rzeczy
wpisał po tym pierwszym znaku i nie wiemy, co przez to rozumie. Ale
trzeba te dane przeczytać, a koniec tych danych nie jest na żadnym
końcu bufora, tylko tam, gdzie pojawił się Enter, który też oczywiście
wczytujemy, zanim przejdziemy do danych za nim.

Chyba że plik skończył się wcześniej. W każdej sytuacji musimy być
też gotowi na koniec pliku i jakoś na niego zareagować. stdio nie
będzie próbowało czytać za końcem pliku (jeśli nie użyjemy clearerr),
więc jeśli natrafimy na koniec pliku, to trzeba coś sensownego zrobić
- na pewno nie np. kręcić się w kółko czekając na Enter, którego
nigdy nie będzie.

Więcej autorowi pierwotnego pytania nie odpowiem, bo był nieuprzejmy.
--
__("< Marcin Kowalczyk
\__/ ***@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Krzysztof Rudnik
2004-06-03 18:50:37 UTC
Permalink
Post by kamyczek
mam taki problem :(
while(scanf("%c",&wybor)!='1') {
...
}
nie postrafie wyczyscic bufora.
Prosze pilnie o pomoc.
A kto ci w ogole powiedzial ze scanf zwraca odczytany znak?
Zwraca liczbe poprawnie rzeczytanych pol albo EOF.
Poczytaj troche dokumentacji....

Krzysiek Rudnik
kamyczek
2004-06-03 19:15:14 UTC
Permalink
Post by Krzysztof Rudnik
Post by kamyczek
mam taki problem :(
while(scanf("%c",&wybor)!='1') {
...
}
nie postrafie wyczyscic bufora.
Prosze pilnie o pomoc.
A kto ci w ogole powiedzial ze scanf zwraca odczytany znak?
Zwraca liczbe poprawnie rzeczytanych pol albo EOF.
Poczytaj troche dokumentacji....
Krzysiek Rudnik
wyjebajcie sie ciuleeeeeeeeeeee!!!!!!!! :P
Piotr Sietnik
2004-06-04 09:16:36 UTC
Permalink
Post by kamyczek
wyjebajcie sie ciuleeeeeeeeeeee!!!!!!!! :P
Co oblało się zaliczonko?
No, ale to nie powód do chamskiego zachowywania się.
Zwłaszcza w stosunku do osób, które pragną Ci pomóc.
--
Piotr Sietnik
***@pk.mofnet.gov.pl
Kontynuuj czytanie narkive:
Loading...