LINUXSOFT.cz
Nazwa użytkownika: Hasło:     
    CZ UK PL

> Komentarze :: článek C/C++ (10) - Standardní vstup a výstup

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
jeden znak 28.12.2004 18:39 p f
  |- Re: jeden znak 29.12.2004 09:36 Jan Němec
  | L Re: jeden znak 1.1.2005 20:19 Aleš Hakl
  |   L Re: jeden znak 1.1.2005 20:34 Aleš Hakl
  L Re: jeden znak 4.10.2007 15:21 Jan Němec
    |- Re: jeden znak 4.10.2007 16:20 Aleš Hakl
    | L Re: jeden znak 4.10.2007 17:13 Jan Němec
    L Re: jeden znak 14.3.2014 22:09 xerostomus
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
> Szukanie oprogramowania
1. Pacman linux
Download: 4702x
2. FreeBSD
Download: 8874x
3. PCLinuxOS-2010
Download: 8379x
4. alcolix
Download: 10646x
5. Onebase Linux
Download: 9446x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 5941x

1. xinetd
Download: 2228x
2. RDGS
Download: 937x
3. spkg
Download: 4318x
4. LinPacker
Download: 9583x
5. VFU File Manager
Download: 3020x
6. LeftHand Mała Księgowość
Download: 6835x
7. MISU pyFotoResize
Download: 2592x
8. Lefthand CRM
Download: 3392x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 2861x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz