conio2.h
Essa biblioteca é uma adaptação da biblioteca do borland, chamada conio.h, para o mingw. Ela possui só algumas funções para limpeza de tela, mudar a cor da letra ou posicionar o cursos no console.
O manual de referência dela está aqui: http://conio.sourceforge.net/docs/conio.pdf
É pena que eles usem tal coisa (conio.h, conio2.h). Deveriam usar apenas e tão somente as rotinas de - e, se possível, sem interação direta com o usuário; tudo deveria ser a partir de arquivos e/ou pipes.
conio é uma biblioteca padrão da borland, para c e não c++(iostream).
Ela possui saída e entradas formatada, como getch(), putch(), gotoXY(x,y), e formatação de cores de caracteres e background. Muitos caixas eletrônicos já usaram ela.
Sei, eu usava algo parecido no tempo do MS-DOS (acho que se chamava <conio.h>, no compilador Borland Turbo C 2.0 também).
Mas ainda acho que para aprender algoritmos e outras coisas eu não acho interessante que o gajo fique pegando dados da tela (ou seja, fique lutando com desenho de tela e outras coisas inúteis hoje em dia). No máximo receba os argumentos via parâmetros, ou então leia os dados de entrada de um arquivo.
Mesmo porque um programador C++ que ganha seu dinheirinho com C++ não fica usando tais coisas, e sim puxando dados via sockets ou web services. Não acho interessante nem em termos didáticos - aprende-se uma coisa atrelada a um determinado compilador antigo, que roda em um ambiente que ninguém usa mais para aplicativos.
Verdade. E se for fazer telas, vai ser aplicação de janela, com GTK, MFC ou qualquer outra API gráfica da preferência da empresa.
[quote=entanglement]Sei, eu usava algo parecido no tempo do MS-DOS (acho que se chamava <conio.h>, no compilador Borland Turbo C 2.0 também).
Mas ainda acho que para aprender algoritmos e outras coisas eu não acho interessante que o gajo fique pegando dados da tela (ou seja, fique lutando com desenho de tela e outras coisas inúteis hoje em dia). No máximo receba os argumentos via parâmetros, ou então leia os dados de entrada de um arquivo.
Mesmo porque um programador C++ que ganha seu dinheirinho com C++ não fica usando tais coisas, e sim puxando dados via sockets ou web services. Não acho interessante nem em termos didáticos - aprende-se uma coisa atrelada a um determinado compilador antigo, que roda em um ambiente que ninguém usa mais para aplicativos.[/quote]
mas para aprender algoritmos não se precisa de mais nada. Somente I/O e terminal. Conio é somente uma lib que formata textos
Mas pensando-se em coisas modernas concordo. Para algoritmos acho que é suficiente.
O incrível é a quantidade de código legado em C/C++… mesmo assim dificilmente vejo alguém usando conio.h… o padrão C++ de 1998 já recomendava não usar .h…
De qualquer forma… Google é bem melhor que biotônico fontoura…
O engraçado é que colocaram umas bibliotecas no exame de JCJP6… que inclui essas coisas antigas de terminal… :lol: :lol: :lol:
Essa biblioteca é tão famosa… rs… que nem é padrão Posix/Ansi… se não me engano no Visual Studio tem ela e deve estar como cconio… assim como cstring, cmath e tal…
É que é tão fácil usar essas coisas que na prática é a melhor forma de fazer algum teste rápido… e não é que no Java até incluiram uma imitação de printf… rs…
E para bolar coisas de alta performance nada melhor que ler arquivo binário em uma struct C/C++ na memória RAM… ela já vai preenchidinha… rs…
Claro que não é ansi, e nem posix. Já foi falado que é da borland. Ela é somente um utilitário para formatação de IO.
Não sei porque criticar coisas antigas. Se fosse assim, curses e ncurses já tinha saído do desenvolvimento de sistemas unix, mas mesmo assim, ela é utilizada e muito.
Vide drivers nvidia, os instaladores do ubuntu, onde não se precisa mais do que apenas exibir informações em um terminal.
conio2
Digamos que você pense na tela texto como sendo uma matriz de 80 colunas por 24 (ou 25) linhas. A conio2 ( http://conio.sourceforge.net/docs/html/conio2_8h.html ) tem alguns métodos para posicionar o cursor onde você quiser, para você poder fazer um daqueles formulários horríveis em modo texto onde você escreve o texto no lugar que você quiser, e você entra com o texto na posição onde você quiser.
Dá para você limpar uma linha inteira, mudar a cor e o fundo do texto, e outras coisas esquisitas.
No caso do Linux, você usaria o próprio ncurses, que é muito mais poderoso (e um pouquinho mais difícil de usar que a conio2.h).
Por exemplo,
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/intro.html
Não pude deixar de colocar minha opinião aqui. Algortimos, ED, Programação “1”: C, *nix like, com stdio.h. Nada mais.
Hum… lembra aqueles jogos do “telejogo”? (Eu não lembro o nome daqueles consoles anteriores ao Atari 2600)
Quando um aluno aprende a fazer um game daqueles ele entende a distância que o separa de um game de PS3. Jogos feitos com curses/conio ajudam bastante no aprendizado de lógica, a saída de dados é numa “simples” matriz, etc.
http://www.openbsd.org/cgi-bin/cvsweb/src/games/ --> o game rain é bem simples, feito com curses.
conio2.h
Nem pra procurar hein…
[code]// Copyright © 2005 by Piotr He³ka (piotr.helka@nd.e-wro.pl)
// Linux C++ (not full) implementation of Borland’s conio.h
// v 1.01
// It uses Ncurses lib, so accept also its terms.
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// ----------------------------- krotki opis ------------------
// Biblioteka obs³uguje mniej lub bardziej zgodnie:
//
// cgets()
// cputs()
// clreol()
// clrscr()
// cprintf()
// cscanf()
// getch() (chyba nie wszystkie kody tak jak w conio.h)
// getche()
// gotoxy()
// kbhit()
// putch()
// textbackground()
// textcolor()
// wherex()
// wherey()
// window()
//
// kompatbyilno¶æ w kierunku Linux CONIO.H -> DOS CONIO.H
// bedzie zachowana
// Aby skompilowac
// $g++ nazwa_progsa.cpp -lncurses -o nazwa_progsa.o
// ------------------------------- define ---------------------
#ifndef __NCURSES_H
#include <ncurses.h>
#endif
#ifndef __CONIO_H
#define __CONIO_H
#endif
#define MAX_OKIEN 256
#define BLACK 0
#define RED 1
#define GREEN 2
#define BROWN 3
#define BLUE 4
#define MAGENTA 5
#define CYAN 6
#define LIGHTGRAY 7
#define DARKGRAY 0
#define LIGHTRED 1
#define LIGHTGREEN 2
#define YELLOW 3
#define LIGHTBLUE 4
#define PINK 5
#define LIGHTCYAN 6
#define WHITE 7
// -------------------------------- globalne ------------------
//int (* wsk_f)(void) = getch;
#undef getch
#define getch CURSgetch
#undef getche
#define getche CURSgetche
void inicjuj();
class Startuj // konstruktor i destruktor klasy beda odpowiedzalni
{ public: // za automagiczna inicjalizacje ustawien
Startuj(){ inicjuj(); }
~Startuj(){ endwin(); }
} Start; // inicjuj!
typedef struct
{
int xup;
int yup;
int xdown;
int ydown;
WINDOW* okno;
} Okno;
bool zainicjowane = FALSE; //czy juz po initscr() ?
int znakSpecjalny = -1; //potrzebne do getch’a
int n = 0; //liczba uzytych okienek
short kolorTekstu = COLOR_WHITE;
short kolorTla = COLOR_BLACK;
short biezacaPara;
Okno okienka[MAX_OKIEN]; //tablica struktur aktywnych okienek
WINDOW* aktywneOkno = NULL; //wsk na aktywne okno
// ----------------------------- koniec globalnych ------------
void inicjuj()
{
initscr();
start_color(); //wlaczmy kolorki
cbreak(); //wylaczmy buforowanie wejscia
noecho(); //bez wyswietlania na ekran
//raw(); //nadpisywane i tak przez noecho
keypad(stdscr, TRUE);
scrollok(stdscr, TRUE);
//domyslne okno
aktywneOkno = stdscr;
zainicjowane = TRUE;
//utworzmy macierz 8x8 kolorow tla i tekstu
short kolor = 1;
for(short i=0; i<8; i++)
{
for(short j=0; j<8; j++, kolor++)
{
init_pair(kolor,i,j);
if(i == COLOR_WHITE && j == COLOR_BLACK)
//ustawmy czarne tlo i bialey tekst jako standard
{
biezacaPara = kolor;
}
}
}
wrefresh(aktywneOkno);
}
int simple_strlen(char* str)
{
char* p;
for(p = str; *p != 0; p++);
return p-str;
}
void cputs(char* str)
{
waddstr(aktywneOkno, str);
wrefresh(aktywneOkno);
}
char* cgets(char* str)
{ // nie wiem dokladnie jak dziala orginalna f. cgets bo nie mam
// do niej referencji…
if(str == NULL || *str == 0)
{
*(str+1) = 0;
return NULL;
}
int max = (int)(*str);
echo();
if(wgetnstr(aktywneOkno, (str + 2), max) == ERR)
{
*(str+1) = 0;
return NULL;
}
noecho();
*(str+1) = (char)simple_strlen(str+2);
return str+2;
}
void clreol()
{
wclrtoeol(aktywneOkno);
wrefresh(aktywneOkno);
}
void clrscr()
{
if(!zainicjowane) inicjuj();
wbkgd(aktywneOkno, COLOR_PAIR(biezacaPara));
//trzeba przesunac kursor? chyba nie…
wclear(aktywneOkno);
}
int cprintf(char *fmt, …)
// czysty hardcore
{
if(!zainicjowane) inicjuj();
va_list ap;
va_start(ap, fmt);
int i = vwprintw(aktywneOkno,fmt, ap); //jakie proste ;-)
va_end(ap);
wrefresh(aktywneOkno);
return i;
}
int cscanf(char *fmt, …)
{
if(!zainicjowane) inicjuj();
echo();
va_list ap;
va_start(ap, fmt);
int i = vwscanw(aktywneOkno, fmt, ap);
va_end(ap);
wrefresh(aktywneOkno);
noecho();
return i;
}
int CURSgetch()
{
if(!zainicjowane) inicjuj();
int znak;
if(znakSpecjalny>0) //drugi czlon znaku specjalnego 0x00 i 0x??
{
//zamieniamy znak na kod DOSowy - conio.h
znak = znakSpecjalny;
znakSpecjalny = -1;
return znak-265+59;
}
znak = wgetch(aktywneOkno);
if(znak > 255) //to mamy znak specjalny 0x00
{
znakSpecjalny = znak;
return 0;
}
return znak;
}
int CURSgetche()
{
echo();
int znak = getch();
noecho();
return znak;
}
int gotoxy(int x, int y)
{
if(!zainicjowane) inicjuj();
wmove(aktywneOkno, y - 1, x - 1);
return 0;
}
int kbhit()
{
int znak;
wtimeout(aktywneOkno, 0);
znak = wgetch(aktywneOkno);
//wtimeout(aktywneOkno, -1);
nodelay(aktywneOkno, FALSE);
if (znak == ERR) return 0;
ungetch(znak);
return 1;
}
int putch(int znak)
{
wechochar(aktywneOkno,znak);
}
void textbackground(short kolor)
{
if(!zainicjowane) inicjuj();
kolorTla = kolor%8;
short k=1;
for(short i=0; i<8; i++) //wyszukajmy numer pary dla kolorow
{
for(short j=0; j<8; j++, k++)
{
if(kolorTekstu == i && kolorTla == j)
{
biezacaPara = k;
wbkgd(aktywneOkno, COLOR_PAIR(k));
}
}
}
wrefresh(aktywneOkno);
}
void textcolor(short kolor)
{
if(!zainicjowane) inicjuj();
kolorTekstu = kolor%8;
short k=1;
for(short i=0; i<8; i++) //wyszukajmy numer pary dla kolorow
{
for(short j=0; j<8; j++, k++)
{
if(kolorTekstu == i && kolorTla == j)
{
biezacaPara = k;
wcolor_set(aktywneOkno,k, NULL);
}
}
}
wrefresh(aktywneOkno);
}
int wherex(void)
{
if(!zainicjowane) inicjuj();
int x, y;
getyx(aktywneOkno, y, x);
return x + 1;
}
int wherey(void)
{
if(!zainicjowane) inicjuj();
int x, y;
getyx(aktywneOkno, y, x);
return y + 1;
}
void window(int xup, int yup, int xdown, int ydown)
{
if( xup<1 || yup<1 || xdown>COLS || ydown>LINES)
{ //jesli zle dane podano…
xdown = COLS - xup;
ydown = LINES - yup;
//return;
}
bool istnieje = FALSE;
if(!zainicjowane) inicjuj();
/*
Istnieje alternatywne rozwiazanie tworzenia nowych okien,
w momencie tworzenia nowego okna, usuwa sie okno poprzednie,
tzn zwalnia pamiec tego okna, komenda delwin(nzw_okna) i tworzy
sie nowe okno, ustawiajac jego jako domyslne-biezace. Jednak
poniewaz moze to zabierac za duzo czasu i niepotrzebnie spowolniac,
majac na uwadze rozmiar dzisiejszych pamieci, postanowilem, uzyc
tablicy, ktora przechowywuje wsk. na adresy okien i wykorzystuje
zaalokowana juz przestrzen. Aczkolwiek mozna to w kazdej chwili zmienic.
*/
for(int i=0; i<n && !istnieje; i++) //sprawdzimy czy podane okno juz nie
// zostalo wczesniej stworzone
{
if( okienka[i].xup == xup && okienka[i].yup == yup
&& okienka[i].xdown == xdown && okienka[i].ydown == ydown)
{
aktywneOkno = okienka[i].okno;
istnieje = TRUE;
clrscr();
}
}
if(!istnieje && n >< MAX_OKIEN) //jesli nie ma takiego okna to tworzymy je
{
aktywneOkno = newwin(ydown - yup + 1, xdown - xup + 1, yup - 1, xup - 1);
//nie dam glowy czy dokladnie tak wyswietla conio.h
//do tablicy zapisac...
okienka[n].okno = aktywneOkno;
okienka[n].xup = xup;
okienka[n].yup = yup;
okienka[n].xdown = xdown;
okienka[n].ydown = ydown;
wcolor_set(aktywneOkno,biezacaPara, NULL);
wbkgd(aktywneOkno, COLOR_PAIR(biezacaPara));
//przywrocenie ustawien klawiszy
cbreak(); //wylaczmy buforowanie wejscia
noecho(); //bez wyswietlania na ekran
keypad(aktywneOkno, TRUE); //pelne kody klawiszy
scrollok(aktywneOkno, TRUE);
n++;
}
wrefresh(aktywneOkno);
return;
}[/code]