Jak testovat zaplnění obrazovky (terminálu) ? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak testovat zaplnění obrazovky (terminálu) ? – C / C++ – Fórum – Programujte.comJak testovat zaplnění obrazovky (terminálu) ? – C / C++ – Fórum – Programujte.com

 

Pavel
~ Anonymní uživatel
383 příspěvků
19. 5. 2017   #1
-
0
-

Dobrý den,

snažím se učit jazyk C z Heroutovy Učebnice jazyka C. Používám OS Linux (Ubuntu). Jedno z cvičení v knize je napsat funkci void vypis(FILE *fr), která vypíše na obrazovku obsah textového souboru. To by nebyl problém. V další úloze je zdokonalit funkci vypis() tak, aby zajišťovala stránkování po zaplnění obrazovky. A tady jsem narazil. Chtěl bych se zeptat, jak můžu otestovat, že se při výpisu dorazilo na konec obrazovky (konzole, okna terminálu). Napsal jsem to takhle:

void vypis(FILE *fr)
{
  int znak = 0,
      strana = 0;
  while ( (znak = getc(fr)) !=  EOF) {
    if (znak == '\f') {
      strana = strana + 1;
      printf("\nStrana %d\n", strana);
    }
    else
      putchar(znak);
  }
  printf("\nPocet stran %d\n", strana);

}

protože jsem se domníval, že escape sekvence \f (form feed) je neviditelný "znak", který odděluje stránky. Ale takhle to asi není. V proměnné strana je pořád nula. Takže ta podmínka by měla vypadat jinak. Jen nevím jak... Poradili byste, prosím ?

(Ještě dodám, že soubor se otevírá a zavírá pro čtení v hlavní funkci (main), kde se taky volá funkce vypis(). Soubor se normálně vypisuje, v tom není problém.)

Moc děkuju za pomoc !

Nahlásit jako SPAM
IP: 78.102.152.–
gna
~ Anonymní uživatel
1891 příspěvků
19. 5. 2017   #2
-
0
-

Podmínka vypadá dobře, ale máš v tom souboru ten znak, že by se měl načíst?

Nicméně tohle nemáš dělat. Tím textovým souborem se pravděpodobně rozumí soubor, ve kterém jediný speciální znak bude odřádkování. Takže máš počítat pozici, na kterou vypisuješ a po zaplnění obrazovky počkat na pokyn k výpisu další strany a opakovat to.

Klidně do toho zapracuj i další řídící znaky, jako třeba ten form-feed a další. Pak pozor na to, že na Linuxu jde terminál ovládat výpisem řídících sekvencí (změna pozice kurzoru, scrollování, atd.).

Rozměry terminálu nejsnáze zjistíš pomocí getenv COLUMNS a LINES, které samozřejmě nemusí být nastavené. Případně pomocí ioctl TIOCGWINSZ. Změnu velikosti můžeš detekovat chytáním signálu SIGWINCH. A výstup programu taky vůbec nemusí být na terminál.

Pokud si s tím budeš chtít pořádně vyhrát, tak máš na nějakou dobu co dělat :-) Ale ty pokročilé věci asi zatím vynech a řeš jen ten jednoduchý texťák a rozměry třeba natvrdo.

Nahlásit jako SPAM
IP: 213.211.51.–
Pavel
~ Anonymní uživatel
383 příspěvků
19. 5. 2017   #3
-
0
-

#2 gna Moc děkuju. V podstatě to, co dělám, je nelogický. Prohlížím texťák a hledám v něm form feed, kterej tam pravděpodobně ani není (vlastně určitě tam není, když ho tam program nenajde...). Místo toho jsem se měl starat o detekci rozměrů konzole. Jinak jasně, máš pravdu: místo číslování stran by tam měla být spíš nějaká zarážka, třeba getchar(), která ten výpis pozastaví a počká na nějakej vstup od uživatele, než bude pokračovat. Jdu se podívat na tyhle funkce (getenv COLUMNS a LINES, ioctl TIOCGWINSZ a SIGWINCH), o kterých se zmiňuješ. Nemám ani tušení, že vůbec existují, natož jak se používají, jaké mají parametry, atd. Tohle mě zajímá. Napsat to tak, aby se to pravidelně zastavovalo třeba po třiceti odřádkováních - \n  (když budu předpokládat, že okno má v defaultním rozměru třeba 30 řádek) - by sice šlo, ale je to dost nuda:-) Navíc zase: řádek v tom texťáku nemusí (a nebude) odpovídat řádku v konzoli. 

Ještě jednou moc děkuju, jdu se učit :-)

Nahlásit jako SPAM
IP: 78.102.152.–
gna
~ Anonymní uživatel
1891 příspěvků
20. 5. 2017   #4
-
0
-

S těmi COLUMNS a LINES jsem se seknul. V bashi existují, ale programu se nepředávají. To ioctl bude nejčistší.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 52 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý