• 7 odgovora
  • 3.035 pregleda
getchar() HELP 25.06.2003. u 00:00 · pre 284 meseci #1
#include <stdio.h>


void main ()
{
char ch;
while(1) {

ch=getchar();
printf("%c ",ch);

if (ch==EOF) break;
}

}

Rezultat:

Upišem "sto je ovo" i stisnem i tek onda ispiše ispiše "sto je ovo".
Problem:
Zašto nakon svakog mog ispisanog slova ne ispisuje to slovo nego tek kad stisnem enter. Čini se da tek kad stisnem enter izvršava se printf, ali se petlja while izvodi za svako upisano slovo samo bez izvođenja printf-a.
Re: getchar() HELP 25.06.2003. u 00:39 · pre 284 meseci #2
mislim da je to do konzole, a ne do tvog programa
vecina konzola namerno ne 'stampa' liniju sve dok se \n ne 'posalje' konzoli
Re: getchar() HELP 25.06.2003. u 03:42 · pre 284 meseci #3
Najbolji odgovor bi možda bio - pogledaj u dokumentaciji kako interno rade baferi u STDIO-u. Najkraće rečeno STDIO koristi različite vrste baferovanja kada su razne stvari u pitanju - generalno ovde mislim da je u pitanju linearno baferovanje (bafer se "flush"-uje kad se pojavi LineFeed karakter)... Naravno, ispravite me ako grešim. :)
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: getchar() HELP 25.06.2003. u 15:09 · pre 284 meseci #4
Jeste, Leka je u pravu, ali čini mi se da se to ne može rešiti za ulazne fajlove, ili bar ne može za stdin. Preporučujem da koristiš ncurses biblioteku za takve stvari, ili već neku od sistemskih funkcija (npr. čitaš direktno sa /dev/tty*).
Potpis
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
Re: getchar() HELP 25.06.2003. u 15:21 · pre 284 meseci #5
Jeli možda moguće da je on napravio printf i pohranio ga u međuspremnik ali tek kad stisnem enter onda se iz međuspremnika ispisuje na stdout. Tako je berem sa datotekama. Ako sa nekoliko fprintf upisujemo nešto u datoteku onda se to upisuje u datoteku tek kad zatvorimo datoteku ili napravimo fflush(). Da li je moguće da kad stisnemo enter poslije upisa ima za stdout istu funkciju kao što je za datoteke na disku fclose() i fflush.
Re: getchar() HELP 25.06.2003. u 18:30 · pre 284 meseci #6
Mislim da se tip baferovanja MOŽE promeniti, ali s obzirom da to nikada nisam radio - ne znam kako. Čini mi se da sam u "Advanced Programming in UNIX Environment" davno pročitao nešto u vezi toga - možda grešim, a možda i ne - kad odem kući pogledaću.
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: getchar() HELP 25.06.2003. u 20:30 · pre 284 meseci #7
Leko, za to se koriste funkcije setbuf, setvbuf i slične, ali prema mom iskustvu, one ne rade sa stdin-om (zapravo, man stranica pominje keširanje samo za izlazne strimove, a ne za ulazne, kakav je stdin). Čini mi se da sam u nekoj draft specifikaciji ISO C-a 99 video da je stdin linijski baferisan, i da to nije moguće izmeniti.

Uostalom, ovo je problem na koji mnogi početnici nalete, i bilo bi čudno da postoji rešenje nezavisno od sistema, a da ga niko ne zna napamet ;-)
Potpis
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
Re: getchar() HELP 03.07.2003. u 22:27 · pre 283 meseci #8
leka je u pravu to moze da se podesi unutar termios strukture , a ako nekoga mrzi to da radi postoji program stty koji radi sve sto mozes sam da uradis sa termiosom

znaci tty -icanon, i program ce ispisivati svako slovo nakon sto bude bilo procitano, a ne nakon znaka za novi red. Najbolji test za ovo vam je cat . E sada kako ovo na MS Windowsima uraditi nemojte mene pitati
Potpis
http://speedy-order.com
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme