Portál AbcLinuxu, 9. května 2025 22:04

Dotaz: kontrolování klávesnice během výpisu v C

19.11.2012 18:07 matin2
kontrolování klávesnice během výpisu v C
Přečteno: 308×
Odpovědět | Admin
Existuje v C nějaká funkce, která by kontrolovala vstup z klávesnice ale v případě nestiknutého třeba Enteru by program pokračoval dále?
Použití: vypisuju na obrazovku proud data a když uživatel stiskne klávesu, výpis se zastaví a vypíše tři znaky s největší četností.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

19.11.2012 18:46 MadCatX
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevím, jestli je na to přímo funkce (pochybuju), ale já bych pustil výpis na jednom vlákně a na druhém třeba getchar()em čekal na vstup z klávesnice.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

volatile int run = 1;

void* print_random(void* arg)
{
    while (run) {
        int r = rand() % 25 + 65;
        printf("%c\n", (char)r);
        sleep(1);
    }

    return NULL;
}

int main()
{
    srand(time(NULL));

    pthread_t prnThr;
    int prnThrID = pthread_create(&prnThr, NULL, print_random, NULL);

    getchar();
    run = 0;
    pthread_join(prnThr, NULL);

    return 0;
}
19.11.2012 19:48 Marble | skóre: 27 | blog: marble
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud nepotřebuješ stdio, tak je další možnost select(), případně poll(). A k tomu/nebo nastavit filedescriptor standardního vstupu jako non-blocking (viz fnctl()). Co se stane při komboinaci select() se stdio nevím, ale asi nic moc dokumentovaného.

Další možností je použít rovnou ncurses anebo nějakou podobnou knihovnu.
Josef Kufner avatar 20.11.2012 02:16 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
Select s stdio funguje úplně v pohodě. Jen je potřeba dávat pozor na řádkové bufferování v terminálu a případně ho vypnput (např. pomocí ncurses).
Hello world ! Segmentation fault (core dumped)
20.11.2012 11:46 Marble | skóre: 27 | blog: marble
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
Ad buffer: dobrá připomínka. Nastavit nebufferovaný vstup jde i funkcí setvbuf(). Linkovat ncurses jen kvůli bufferování mi přijde trochu přehnané.
20.11.2012 13:25 Jirka
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
další hrátky s terminálem jdou udělat taky přes termios (v tomto případě lze třeba zrušit flag ICANON nebo nastavit raw mode)
Josef Kufner avatar 20.11.2012 18:32 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
Jo, na tohle jsm si nemoh vzpomenout ;-)
Hello world ! Segmentation fault (core dumped)
19.11.2012 21:24 l4m4
Rozbalit Rozbalit vše Re: kontrolování klávesnice během výpisu v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
S ncurses takto (linkovat s -lcurses):
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ncurses.h>

int
main(void)
{
    static unsigned long counts[0x100];

    initscr();
    cbreak();
    noecho();
    nodelay(stdscr, TRUE);
    scrollok(stdscr, TRUE);

    memset(counts, 0, 0x100*sizeof(unsigned long));
    while (1) {
        if (getch() != ERR) {
            unsigned int i;
            printw("\nCounts:");
            for (i = 0; i < 0x100; i++)
                printw(" %lu", counts[i]);
            printw("\n");
        } else {
            int c = random() % 64 + 33;
            counts[c]++;
            printw("%c", c);
        }
        refresh();
        usleep(10000);
    }

    return 0;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.