Hello!
Az lenne a kérdésem, hogy milyen (esetleg ANSI) módon lehet megoldani, hogy a program futása közben a getc(stdin)-hez hasonlóan figyeljem a leütött karakter(eke)t, de úgy, hogy a program ne várja meg, amíg kap valami inputot, csak egyszerűen nézze meg, hogy volt-e input adott pont óta és ha nem, akkor folytatódjon a futás.
Köszönöm, bye: night[w]
- 1405 megtekintés
Hozzászólások
Szia!
Erre két módszer is létezik. Az egyik, hogy pollozod a bemenetet (man 2 poll) és csak akkor hívod meg a getc()-t, ha történt valami esemény a bemeneten. A másik lehetőség pedig az, hogy a bemenetet non-blocking üzemmódba teszed (fcntl(0, F_SETFL, O_NONBLOCK)) ekkor a getc() azonnal vissza fog térni, a visszatérési érték szerintem EOF lesz, de ebben nem vagyok maradéktalanul biztos.
- A hozzászóláshoz be kell jelentkezni
Sokat kerestem utána, egyértelműen csak operációs rendszer függő megoldás létezik. Ez linux specifikus. Van olyan módszer, ami csak header fileokban tér el a különböző rendszereken? Vagy legalábbis a lehető legminimálisabban? Mert windows-on a linker undefined referencet ad vissza ictlsocket(windows-os megfelelő)-re Code::Blocks és Dec-C++ alatt is(minden header file be van includolva). fcntl-re meg az F_SETFL-nél dobja, hogy nem ismeri ezt a függvényt és nem fordul le(fcntl.h es winioctl.h includolva van). Jó lenne valami olyan megoldás, ami winen is működik.
Bye: night[w]
- A hozzászóláshoz be kell jelentkezni
a platformfuggoseget megkerulheted az #ifdef/#define/#endif
makrokkal
ha az ioctlsocket-et hasznalod a fordito linkeli a wsock32.dll-t?
mert szerintem nem, es ezert kapod az undefined referencet
/* bocs az esetleges helyesirasi hidakert */
- A hozzászóláshoz be kell jelentkezni
Mire kell ez az egesz? Ugyertem, pl. linux/unix alatt a terminal alapertelmezesben sorbufferelt, igy pl. akkor nem mutatnak a standard megoldasok (pl. poll(), select()) kiolvashato input-ra utalo nyomokat, ha van adat, csak nem zartad le a sort (\n-nel).
erdemes talan megnezni az ncurses-t is. eleg egyszeru, ha effele alapszintu "interaktiv" programokat akar csinalni az ember, es ez me'g a terminal buffereleset is kezeli (amit ugyan sima fgetc/read/select-tel is megoldhatsz, hogyha elotte egy rakas termios-ioctl-t raengedsz a terminalra). es ez is viszonylag "standard", pl. a regi szep DOS-os idokben is szinte ugyanigy 1:1-ben kellett "konzolt" kezelni (lasd regi #include <conio.h>-s programok).
Egy primko pelda:
/* compile: `cc ncurses-getch.c -o ncurses-getch -lncurses` */
#include <stdio.h>
#include <ncurses.h>
int main(int argc,char *argv[])
{
int ch;
initscr();
noecho();
/* nodelay(stdscr,TRUE); */
while ( 1 )
{ ch=getch();
fprintf(stdout,"Read: %d (%.2x) '%c'\r\n",ch,ch,ch);
/*printf("Read: %d (%.2x) '%c'\r\n",ch,ch,ch);*/
fflush(stdout);
};
return(0);
}
- A hozzászóláshoz be kell jelentkezni
én libevent-et használtam ilyenre, az platform-független, ráadásul nagyon gyors is.
- A hozzászóláshoz be kell jelentkezni