|
|
jeden znak
|
28.12.2004 18:39
p f
|
Hezky serial, ale ja bych potreboval reagovat rovnou na klavesu (bez entru), je to mozne?
Predem dekuji za navrhy
|
|
|
Re: jeden znak
|
29.12.2004 09:36
Jan Němec
|
Pokud vím ve standardním C to nejde. (Pokud se pletu, opravte mě někdo.) V DOSu se to řešilo pomocí nestandardních funkcí z conio.h, na linuxové konzoli jsem to nikdy neřešil. |
|
|
Re: jeden znak
|
1.1.2005 20:19
Aleš Hakl
|
Ve standardnim C to jde, v DOSu to pokud vim standardni cestou nejde.
pokud pouzivate <stdio.h>, kouknete se na funkce fgetc(3), getc(3) a getchar(3)
druha moznost jak to resit je primo bez <stdio.h> volanim read(2), ve stylu:
char znak;
read(0,&znak,1);
Nutno podotknout, ze neni vhodne oba pristupy kombinovat v jednom programu. |
|
|
Re: jeden znak
|
1.1.2005 20:34
Aleš Hakl
|
No, ja zase nemyslim.
Jak jsem uvedl vyse to samozrejme funguje, ale:
Pred tim nez prijde vstup programu, ceka terminal na enter nez neco vubec posle. Toto chovani je mozne vypnout, jak je popsano napriklad zde: http://ou800doc.caldera.com/en/SDK_sysprog/_TTY_in_Raw_Mode.html
Dalsi (lepsi, portabilnejsi) moznosti je pouzit knihovny curses (ncurses) a jeji funkce getch(3X), jez osetruje i specialni klavesy. |
|
|
Re: jeden znak
|
4.10.2007 15:21
Jan Němec
|
Četl jsem si knížku "Učíme se programovat v jazyce Assembler pro PC" a náhodou jsem tam našel řešení, které jsem převedl do C. Je třeba nastavit standardnímu vstupu (file descriptor 0), aby nečekal na enter. To se dělá obecnou funkcí ioctl. Načtu si vlastnosti pomocí TCGETS, změním jeden příznak a změnu nastavím pomocí TCSETS. Ne, že by se mi podobný styl programování líbil, ale funguje to. Jen nevím, jestli to po třech letech ještě někoho zajímá.
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
int main(void) {
int i;
char buf[1024];
struct termios t;
ioctl(0, TCGETS, &t);
t.c_lflag &= ~ICANON;
ioctl(0, TCSETS, &t);
i = read(0, (void *) buf, sizeof(buf));
write(1, (void *) buf, i);
return 0;
}
|
|
|
Re: jeden znak
|
4.10.2007 16:20
Aleš Hakl
|
Tohle je ramcove totey jako na tom mem odkazu vyse. K tomuto bych ovsem mel dve poznamky:
Volat primo ioctl(2) asi neni uplne nejlepsi cesta, jelikoz existuji funkce tcsetattr a tcgetattr, ktere delaji prakticky totez + funkce pro snadnejsi pristup k tomu, co je uvnitr struct termios.
Dalsi vec je, ze je pomerne vhodne si to puvodni termios nekam ulozit a na konci programu opet obnovit. |
|
|
Re: jeden znak
|
4.10.2007 17:13
Jan Němec
|
On ten odkaz nefunguje, aspon mne ne. Coz vzhledem k serveru caldera.com asi neni tak prekvapive. |
|
|
Re: jeden znak
|
14.3.2014 22:09
xerostomus
|
Toto ale funguje, ale ne pro široke znaky, tedy prodiakritiku.
Zkousel jsem knihovnu Wchar.h a taky to nešlo:
Vubec jsem překvapen, jak se to ukazalo byt slozitym problemem.
Nasleduje popis v Anglictine.
#include <stdio.h>
#include <wchar.h>
int main ()
{
wchar_t wc;
fputws (L"Enter text. Include a dot (.) in a sentence to exit:\n",stdout);
do {
wc=getwchar();
putwchar (wc);
} while (wc != L'.');
return 0;
}
I simply copied your example and got following problem:
1) processor got occupied to 100 %
2)compiled that and got this strange behavior:
Enter text. Include a dot (.) in a sentence to exit:
a
a //correctly repeated twice
s
s
d
d
ě //stopped echoing on wide characters
š
č
a //echoing is still off
s
d
. //event dot is not terminating
.
.
.
.
^C //I had to kill it
My problem is a teaching program - I need my program wait for a wide character then check it whether a student put a correct character. If correct put it out on screen (stout), if incorrect be silent, do not put anything at the screen.
say "Copy word: řečiště"
řeči
if the student writes s instead of š, it will not go on in completing the word.
|
|
|
|
|
KOMENTARZE
|
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
|
Szukanie oprogramowania
|
©Pavel Kysilka - 2003-2024 |
maillinuxsoft.cz | Design:
www.megadesign.cz
|