|
|
səhifə | 37/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| { clrscr();
for (x=0;x<8;x++)
{ textbackground(x);
textcolor(x+2);
cprintf("Culoarea de fond este: %d \r\n\n",x);
sleep(1);
}}
FUNCTIA textcolor()
-selecteaza culoarea pentru front(culoarea penitei)
SINTAXA GENERALA este: void textcolor(int newcolor);
Functia selecteaza culoarea pentru penita.Nu poate fi apelata pentru
aplicatile Win32 si Win32 GUI.Se pot selecta toate culorile din paleta
grafica,fie utilizand codul numeric,fie codul simbolic al culorii,dupa
cum urmeaza: 0 (BLACK), 1(BLUE), 2 (GREEN), 3 (CYAN), 4 (RED), 5 (MAGENTA),
6 (BROWN), 7 (LIGHTGRAY), 8 (DARKGRAY), 9 (LIGHTBLUE), 10 (LIGHTGREEN),
11 (LIGHTCYAN), 12 (LIGHTRED), 13 (LIGHTMAGENTA), 14 (YELLOW), 15 (WHITE),
128 (BLINK).
Caracterele vor fi afisate in culoarea specificata,doar dupa apelarea
functiei (cele gata afisate raman nemodificate).
Pentru a adauga efectul de stralucire,se va adauga la codul culorii si
128,respectiv codul simbolic 128. EXEMPLU: textcolor(CYAN+BLINK);
Nu toate monitoarele color recunosc si nuantele deschise ale culorilor.
In acest caz,toate culorile LIGHT vor fi egale cu cele DARK.
Functia nu returneaza nici un fel de valori.
EXEMPLU: #include
#include
int x;
main()
{ clrscr();
for (x=1;x<16;x++)
{ textcolor(x+128);
cprintf("Text in culoarea: %d \r\n",x);
sleep(2);
}
textcolor(GREEN+RED);
cprintf("\n\n TEXT");
sleep(3);
}
Observati cum prin combinarea culorilor ROSU si VERDE,se obtine MARO.
Daca realizati aplicatii complexe,in care utilizati o gama foarte larga
de combinatii de culori,puteti realiza o fila separata,in care sa salvati
functii special destinate pentru selectarea culorilor.Salvati fila astfel
realizata ca si fila de tip header (cu extensia .h) si apoi puteti aplica
setarile preferate,pentru orice text sau fereastra de text prin simpla
apelare a functiei dorite.
-271- [ conio.h-textmode() si ungetch() ]
FUNCTIA textmode()
-selecteaza modul ecranului
SINTAXA GENERALA este: void textmode(int newmode);
Functia seteaza modul text al ecranului la valoarea specificata prin
constanta simbolica,dupa cum urmeaza: LASTMODE(revine la setarea pre-
cedenta),BW40(alb-negru/40 coloane),C40(color/40 coloane),BW80(alb-negru/
80 coloane),C80(color/80 coloane),MONO(monocrom/80 coloane) si C4350(EGA/
43 linii si VGA/50 linii).
Functia nu poate fi apelata pentru aplicatiile Win32 si Win32 GUI.
Dupa apelarea functiei,fereastra de text curenta este resetata la valoarea
implicita(egala cu tot ecranul),iar atributele textului sunt resetate la
valorile normale(ca dupa o comanda normvideo() ).
Functia poate fi apelata doar pentru modul text al ecranului(nu si pentru
cel grafic).Pentru modul grafic exista functia restorecrtmode().
Functia nu returneaza valori.
EXEMPLU: #include
#include
main()
{ clrscr();
cprintf("Ecranul la valori implicite \r\n\n");
sleep(3);
textmode(C40);
cprintf("Ecranul cu 40 de coloane !(color) \r\n\n");
sleep(3);
textmode(C80);
cprintf("Revenire la valorile implicite \r\n");
sleep(3);
}
FUNCTIA ungetch()
-elibereaza un caracter in tamponul de memorie
SINTAXA GENERALA este: int ungetch(int ch);
Functia elibereaza un caracter in tamponul de memorie al consolei,astfel
incat caracterul eliberat este primul care va fi citit la o viitoare
comanda getch().Functia esueaza daca este apelata consecutiv inainte de o
noua citire.Functia returneaza caracterul sau EOF in caz de eroare.
EXEMPLU: #include
#include
int w,z,c1;
main()
{ clrscr();
for (z=1;z<5;z++)
{ cprintf("Introduceti un caracter: \r\n");
w=getch();
cprintf("Caracterul ASCII introdus este: %d \r\n");
sleep(2);
clrscr();
c1=ungetch(w);
cprintf("Caracterul introdus a fost returnat !\r\n\n");
cprintf("c1=%d \r\n",c1);
sleep(2); }}
-272- [ conio.h-wherex() si wherey() ]
FUNCTIA wherex()
-returneaza coordonata orizontala a cursorului
SINTAXA GENERALA este: int wherex(void);
Functia returneaza numarul de coloana pentru pozitia actuala a cursorului.
Functia se raporteaza la fereastra de text activa.Nu poate fi apelata
pentru aplicatiile Win32 si Win32 GUI.
Functia returneaza un numar intreg cuprins intre 1 si numarul maxim de
coloane al modului video(coordonata orizontala a cursorului).
EXEMPLU: #include
#include
#include
int x,y;
main()
{ clrscr();
randomize();
for(x=1;x<11;x++)
{ y=random(80);
gotoxy(y,y/4);
cprintf("Cursorul este pe coloana: %d",wherex());
sleep(2);
clrscr();
}}
FUNCTIA wherey()
-returneaza coordonata verticala a ecranului
SINTAXA GENERALA este: int wherey(void);
Functia returneaza numarul de linie pentru pozitia actuala a cursorului.
Functia nu poate fi apelata pentru aplicatiile Win32 si Win32 GUI.
Functia returneaza o valoare intreaga cuprinsa intre 1 si numarul maxim
de linii al modului video(coordonata verticala a cursorului).
EXEMPLU: #include
#include
int x,y;
main()
{ clrscr();
for(x=1;x<7;x++)
{ gotoxy(x*5,x*3);
cprintf("X ");
cprintf("Cursorul este pe linia: %d",wherey());
sleep(2);
clrscr();
}}
Cele doua functii se utilizeaza de obicei impreuna,pentru a determina
pozitia actuala a cursorului in modul text al ecranului.Sunt utile atunci
cand se doreste realizarea unui text cu un anumit format fix,de genul
coloanelor de ziar,tabelelor,chenarelor,casetelor de text etc.Pot fi
utilizate in in cadrul unor algoritmi elementari pentru a realiza efectul
de defilare a textului pe ecran (teletext) etc. sau pot fi utilizate
pentru a citi date dintr-o fila de tip text situate la o anumita pozitie
fixa,pentru a prelua date din tabele sau pentru a realiza jocuri de tip
text (rebus,scrabble etc.).
-273- [ conio.h - window() ]
FUNCTIA window()
-defineste o fereastra activa de tip text
SINTAXA GENERALA este:
void window(int left,int top,int right,int bottom);
Functia defineste pe ecran o fereastra de tip text.Dupa apelarea functiei,
datele de pe ecran vor fi directionate in fereastra nou derfinita.
Fereastra va fi delimitata de coordonatele: left(stanga),top(sus),
right(dreapta) si bottom(jos).Daca se specifica valori incorecte pentru
coordonatele ferestrei,comanda va fi ignorata si se va mentine modul video
actual.Valorile implicite pentru fereastra de tip text cuprinde tot ecra-
nul si are coordonatele(1,1,C,R) unde C este numarul de coloane iar R este
numarul de randuri pentru modul video actual.
Functia nu returneaza valori.
EXEMPLU: #include
#include
int x;
main();
{ clrscr();
for(x=1;x<8;x++)
{ textcolor(x+2);
textbackground(x);
window(x*4,x*2,x*5+10,x*2+2);
cprintf("Fereastra %d ",x);
cprintf("\r\n text...");
sleep(2);
}}
La fel ca si celelalte functii din ,window() nu poate fi apelata
pentru aplicatiile Win32 si Win32 GUI. Functia este un fel de stramos al
ferestrelor din sistemul WINDOWS,dar nu are nici o legatura cu acesta,ci
apeleaza strict la resursele sistemului DOS.Ferestrele nu au butoane de
inchidere si redimensionare si nici alte functii automate asociate,motiv
pentru care necesita prudenta la utilizarea ferestrelor.Daca utilizati
ferestre de tip text,verificati cu atentie toate functiile care se
raporteaza la fereastra activa,nu uitati sa resetati ferestrele atunci
cand nu mai sunt necesare(nu se inchid singure) si apoi sa resetati si
atributele textului,dupa necesitati.Spre deosebire de ferestrele din
sistemul Windows,cele din ASCII DOS pot sa incurce foarte mult derularea
programelor,atunci cand coordonatele ferstrelor sau cele ale functiilor
returneaza valori situate in zone nereprezentabile,etc...
Definitia ferestrelor nu este influentata de stergerea ecranului cu
clrscr().Pentru stergerea unei ferstre,cel mai simplu este sa redefiniti
fereastra dorita,sau sa utilizati normvideo() pentru resetarea valorilor
implicite.Cu putina rabdare,ferstrele de tip text pot contribui la
aspectul grafic al programelor d-voastra,este bine insa sa verificati cu
atentie,pas cu pas,fiecare linie de executie a programului.Eventual puteti
crea o fila de antet (cu extensia .h) in care sa salvati definitia pentru
un anumit numar de ferestre standard,pe care apoi le apelati ori de cate
ori este necesar si respectiv le eliberati cu normvideo().Chiar daca sunt
rudimentare,realizeaza in schimb economie de spatiu,extrem de utila atunci
cand se lucreaza cu texte extrem de mari.
-274- [ io.h - generalitati ]
BIBLIOTECA ANSII C Fila antet
-contine structuri si declaratii pentru rutinele input/output de nivel
inferior (operatii de intrare iesire a datelor in file-la nivel inferior).
Nivelul inferior de integrare a datelor se refera la faptul ca functiile
si rutinele de nivel inferior apeleaza sistemul de operare direct,spre
deosebire de cele care utilizeaza streamuri,tampoane de memorie,rutine de
conversie,rutine de formatare a datelor etc.
Rutinele de nivel inferior pot accesa streamurile standard de intrare
iesire utilizand urmatoarele coduri de manipulare (handles):
0 pentru stdin,1 pentru stdout si 2 pentru stderr.
Rutinele de nivel inferior seteaza variabila globala errno,ori de cate
ori intervine o eroare.Unele dintre ele necesita si prezenta simultana a
altor file de antet (stdio.h,fnctl.h,stat.h,dos.h etc),deoarece utilizeaza
parametri reprezentati prin constante declarate in filele respective.
Rutinele de nivel inferior,prezinta avantajul de a consuma minimum de
memorie de operare,sunt cele mai rapide,apeleaza direct sistemul de ope-
rare,sunt cel mai usor de depanat si cel mai usor de implementat.Dezavan-
tajul consta doar in faptul ca sunt cel mai usor de "virusat".
Spre deosebire de rutinele de nivel inferior,cele cu un nivel superior
de integrare utilizeaza tampoane de memorie si streamuri special destinate
sunt cu un grad inalt de securitate "antivirus",dar sunt greu sau imposi-
bil de depanat de catre alt programator decat cel care le-a implementat.
In plus,cele cu nivel ridicat de integrare,consuma spatii mari de memorie,
sunt mai lente,ocupa procesorul cu operatii multiple de conversie,pot fi
defective prin suprascrierea tampoanelor cu alte date,iar la programele
mari pot bloca memoria de operare cu date inutile,etc...
Unele dintre functiile din io.h necesita si prezenta filei de antet
stat.h in care sunt declarate constantele pentru atributele fisierelor.
Versiunea Turbo C 1.0 (si probabil ca si alte versiuni),nu include fila
respectiva.Puteti copia fila in directorul INCLUDE din alta versiune de
program,sau in lipsa oricarei alte surse,scrieti fila urmatoare:
/* stat.h
definitii pentru functiile ce determina statusul filelor */
# define S_IFMT 0xF000 /*file type mask */
# define S_IFDIR 0x4000 /* directory */
# define S_IFIFO 0x1000 /* FIFO special */
# define S_IFCHR 0x2000 /* character special */
# define S_IFBLK 0x3000 /* block special */
# define S_IFREG 0x8000 /* or just 0x0000,regular */
# define S_IREAD 0x0100 /* owner may read */
# define S_IWRITE 0x0080 /* owner may write */
# define S_IEXEC 0x0040 /*owner may execute */
# define S_ISDIR ((m) & S_IFDIR)
# define S_ISCHR ((m) & S_IFCHR)
# define S_ISBLK ((m) & S_IFBLK)
# define S_ISREG ((m) & S_IFREG)
# define S_ISFIFO ((m) & S_IFFIFO)
# define S_IRWXU 0x01c0 /* RWE permission mask for owner */
# define S_IRUSR 0x0100 /* owner may read */
# define S_IWUSR 0x0080 /* owner may write */
# define S_IXUSR 0x0040 /*owner may execute */
-275- [ io.h - creat() ]
Facultativ,puteti adauga si definitia pentru cele doua functii:stat() si
fstat() si respectiv pentru structura stat,dupa cum urmeaza:
struct stat
{
short st_dev;
short st_ino;
short st_mode;
short st_nlink;
int st_uid;
int st_gid;
short st_rdev;
long st_size;
long st_atime;
long st_mtime;
long st_ctime;
};
int stat(char *path,struct stat *statbuf);
int fstat(int handle,struct stat *statbuf);
Salvati fila cu numele stat.h si apoi copiati fila in directorul INCLUDE,
alaturi de celelalte file antet(Calea completa spre fila trebuie sa fie
de genul: USR\TC\INCLUDE\stat.h ).Pentru redactare si salvare puteti
utiliza editorul din C iar pentru copiere DOS sau Windows.
Pentru orice fel de operatii in file si fisiere,este necesar ca acestea
sa fie create,motiv pentru care,prima functie prezentata este functia
creat().Celelalte vor fi prezentate in ordine alfabetica.
FUNCTIA creat()
-creaza o fila noua sau suprascrie una existenta
SINTAXA GENERALA este: int creat(const char *path,int amode);
Functia creaza o fila noua,la locatia descrisa prin PATH si cu caracterele
specificate prin amode(tipul de acces la fila).Daca fila este in alt
director decat cel curent,este necesara descrierea completa a caii de
acces prin utilizarea semnului \ pentru subdirectoare.Daca la locatia
descrisa prin path exista o fila cu numele specificat,fila respectiva va
fi rescrisa.Tipul de acces la fila,amode,se aplica doar pentru filele
nou create.Fila nou creata va utiliza modul de translatie specificat prin
variabila globala _fmode (poate fi O_TEXT sau O_BINARY).
Daca la locatia specificata exista o fila cu numele specificat,si daca
atributul filei permite accesul la scriere,fila existenta va fi supra-
scrisa,respectiv va fi trunchiata la 0 bytes (va fi stearsa).Puteti uti-
liza functia pentru a elibera datele dintr-o fila,dar,atentie sa nu ster-
geti din greseala file cu date importante.Este bine sa verificati intot-
deauna daca exista file nu numele respectiv,sau sa utilizati de fiecare
data cand creati file noi,o alta extensie(Exemplu: .tx1,.tx2,.tx3 etc...)
Daca la locatia respectiva,exista o fila cu acelasi nume si cu atributul
read-only,fila specificata nu va fi creata(ramane cea originala).
Functia creat() verifica din amode doar daca exista atributul de scriere,
respectiv daca bitul pentru S_IWRITE este 1.Daca bitul pentru S_IWRITE
este 0,fila va fi considerata read-only (din acest motiv este necesara
si fila de antet stat.h cu definitiile constantelor de status).
Pentru amode este necesar sa fie incarcata in memorie si fila .
-276- [ io.h - creat() si access() ]
Pentru amode se pot utiliza urmatoarele valori(constante definite in
stat.h): S_IWRITE -permisiune pentru scriere in file
S_IREAD -permisiune pentru citirea filei
S_IREAD|S_IWRITE -permisiune pentru citire si scriere
Pentru versiunile DOS,permisiunea pentru scriere o implica si pe cea de
citire a datelor,dar este bine sa verificati ce versiune utilizati.
Functia returneaza un numar intreg pozitiv,care va reprezenta si codul
numeric de manipulare a filei (handle) utilizat de multe alte functii.
In caz ca functia nu a fost executata,returneaza valoarea -1,iar in caz
de eroare,seteaza variabila globala errno la una dintre urmatoarele valori
EACCES - permision denied
ENOENT - path or file name not found
EMFILE - too many open files
Functia poate fi ocolita prin crearea de file cu functia open() la care
se utilizeaza optiunea O_CREAT.
EXEMPLU: #include
#include
#include
#include
#include
int handle,dim;
char mesaj[80]="Mesaj de salut !";
main()
{ handle=creat("MESAJ.MMM",S_IWRITE|S_IREAD);
printf("handle= %d \n",handle);
open("MESAJ.MMM",O_RDWR);
write(handle,mesaj,16);
dim=filelength(handle);
close(handle);
printf("Fila nou creata are: %d bytes",dim);
sleep(2);
}
In exemplul de mai sus,dupa crearea filei mesaj.mmm,fila este deschisa,
se scrie mesajul din tamponul mesaj,dupa care se masoara spatiul ocupat
si se inchide fila.Exersati crearea de file,fara deschiderea si scrierea
in ele.Este bine sa utilizati o extensie anume,diferita de cele uzuale
(txt,sys,exe etc...) cu care sa recunoasteti cat mai usor filele create
de d-voastra.
FUNCTIA access()
-returneaza modul de acces la fila (accesibilitatea)
SINTAXA GENERALA este: int access(const char *filename,int amode);
Functia verifica daca fila specificata prin *filename exista si daca poate
fi citita,scrisa sau executata.Valorile posibile pentru amode sunt:
06 -verifica permisiunea pentru citire si scriere a filei
04 -verifica permisiunea pentru citire a filei
02 -verifica permisiunea pentru scriere a filei
01 -executia (ignorata)
00 -verifica daca fila exista
In sistemele de operare DOS,OS/2 si Windows(16 si 32 biti),toate filele
sunt accesibile la citire (00 si 04 returneaza acelasi rezultat).
-277- [ io.h -chmod() ]
In mod similar,pentru sistemul de operare DOS,permisiunea de scriere
implica automat si pe cea de citire,astfel incat valorile amode 06 si 02
sunt echivalente.
Daca numele specificat este numele unui director,functia access veri-
fica doar existenta acestuia (00).
Functia returneaza 0 daca este permis accesul la fila in modul speci-
ficat,sau -1 in caz contrar.In caz de eroare,variabila globala errno este
setata la una dintre urmatoarele valori:
ENOENT -path or file name not found
EACCESS -permission denied
EXEMPLU: #include
#include
#include
char fisier[20];
int x;
main()
{
cprintf("Introduceti numele si extensia fisierului: \n");
scanf("%s",&fisier);
printf("Verificare daca fisierul este accesibil la scriere\n");
x=access(fisier,02);
if (x==0)
printf("Fisierul este accesibil la scriere ! \n");
else
printf("Fisierul nu a fost gasit,sau este inaccesibil ! \n");
sleep(3);
Dostları ilə paylaş: |
|
|