Portál AbcLinuxu, 13. května 2025 17:05

Dotaz: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C

13.4.2009 14:38 merlin111 | skóre: 15
zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Přečteno: 228×
Odpovědět | Admin
Zdravím,

Píšu jednoduché programy typu "ahoj světe" v ANSI C a chtěl bych vědět jestli existuje něco na zjištění aktálních rozměrů terminálu, tj, chci aby písmeno 'A' bylo přesně uprostřed obrazovky. Pevně nadefinované rozměry nejsou to pravé.

Potřebuju napovědět v kterém hlavičkovém souboru to hledat.

Díky.

Každá ulice je slepá jen do té doby, než si opatříš buldozer.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.4.2009 20:51 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Proměnná shellu $COLUMNS obvykle obsahuje počet sloupců. Stačí ji tedy přečíst pomocí getenv. Nevím ale, nakolik je to přenosné.
13.4.2009 20:58 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Tak jsem zalistoval Beginning Linux Programming a našel jsem lepší řešení:
#include <stdio.h>
#include <term.h>
#include <ncurses.h>

int main() {
	int rows, cols;

	setupterm(NULL, fileno(stdout), (int*)0);
	rows = tigetnum("lines");
	cols = tigetnum("cols");
	printf("%dx%d\n", cols, rows);
	return 0;
}
Slinkovat s ncurses (-lncurses), v případě potřeby přidat include cestu (třeba -I/usr/include/ncurses).
b42 avatar 13.4.2009 21:01 b42 | skóre: 12 | Ostrava/Brno
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Odpovědět | | Sbalit | Link | Blokovat | Admin

Osobně bych asi použil to, co je popsáno v man tty_ioctl. Dále by se daly využít ncurses, nicméně to je v tomhle případě asi overkill. A pak je tu ještě ta škaredá možnost se čtením proměnných prostředí $LINES a $COLUMNS :)

13.4.2009 21:05 l4m4
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Dlouho jsem už neviděl, že by ty proměnné byly exportované, alespoň na Linuxu. Takže jsou použitelné ve skriptech v shellu, ale v C programech je ta možnost spíš teoretická...
b42 avatar 13.4.2009 23:05 b42 | skóre: 12 | Ostrava/Brno
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C

Jo, je to blbost ... sorry.

13.4.2009 21:02 l4m4
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
#include <stdio.h>
#include <curses.h>

int
main(void)
{
    setupterm(NULL, 1, NULL);
    printf("%d %d\n", tigetnum("cols"), tigetnum("lines"));
    return 0;
}
Je třeba linkovat s -lcurses.

Jako další level se můžeš podívat na signál SIGWINCH, případně na celou knihovnu ncurses.
14.4.2009 00:28 merlin111 | skóre: 15
Rozbalit Rozbalit vše Re: zjistění aktuálního počtu písmen na řádce a řádek terminálu v C
Díky, tohle je ono. Tady je funční (pokud nejsou dlouhé řádky) výsledek.
void vypis(FILE *fr) /* vypis souboru - fr musi být otevřen pro čtení v text */
{
        char c;
        int p_radek = 1;
                
        while (c = getc(fr), c !=EOF){
                putchar(c);
                if (c == '\n')
                        ++p_radek;
                if (p_radek == radek) {
                        printf("%*s %ls", sloupcu / 2 + 2, "MORE");
                        p_radek = 1;
                        while (getchar() == '\n')
                                ;
                        putchar(c);
                }
        }
}

void init(void)
{
        if (setupterm(NULL, 1, NULL) != ERR) {
                sloupcu = COLS;
                radek = LINES;
        }
}
Každá ulice je slepá jen do té doby, než si opatříš buldozer.

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.