[ zeco @ 25.06.2003. 00:00 ] @
#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.
[ Predrag Damnjanovic @ 25.06.2003. 00:39 ] @
mislim da je to do konzole, a ne do tvog programa
vecina konzola namerno ne 'stampa' liniju sve dok se \n ne 'posalje' konzoli
[ leka @ 25.06.2003. 03:42 ] @
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. :)
[ tOwk @ 25.06.2003. 15:09 ] @
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*).
[ zeco @ 25.06.2003. 15:21 ] @
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.
[ leka @ 25.06.2003. 18:30 ] @
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.
[ tOwk @ 25.06.2003. 20:30 ] @
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 ;-)
[ Dejan Lozanovic @ 03.07.2003. 22:27 ] @
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