Limbajul c si C++ abc-doar


} Verificati fisierul mesaj.mmm,sau orice alta fila din directorul TC(una



Yüklə 4,6 Mb.
səhifə38/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   34   35   36   37   38   39   40   41   ...   55

}

Verificati fisierul mesaj.mmm,sau orice alta fila din directorul TC(una

creata de d-voastra).
FUNCTIA chmod()

-modifica modul de acces la fila

SINTAXA GENERALA este: int chmod(const char *path,int amode);

Functia seteaza modul de acces la fila,la cel specificat prin amode.

Pentru amode se pot utiliza constantele S_IWRITE,SIREAD etc. definite in

fila antet .

Functia returneaza zero daca a setat modul de acces specificat,sau -1 in

caz contrar si seteaza in caz de eroare variabila errno la una dintre

valorile: EACCES (permission denied) sau ENOENT(path or file not found).

EXEMPLU: #include

#include

#include

#include

int x;

main()

{ x=chmod("mesaj.mmm",S_IREAD);

if(x==0)

printf("Fila mesaj.mmm este acum read-only \n");

else

printf("Fila nu a fost accesibila pentru modificare !\n");

sleep(3); }


-278- [io.h-_chmod() si chsize() ]

Pentru verificare,puteti derula din nou exercitiul de la functia access(),

sau verificati atributul filei cu un program de DOS (Norton etc.).
FUNCTIA _chmod()

-verifica sau reseteaza atributele filei

SINTAXA GENERALA este:

int _chmod(const char *filename,int func [,int attrib] );

Daca parametrul func este specificat 0,functia returneaza atributul filei,

iar daca func este 1,functia seteaza atributul MS-DOS al filei,dupa cum

este specificat prin attrib.Atributul MS-DOS al filei poate fi:

FA_RDONLY atributul read-only

FA_HIDDEN hidden file (fila ascunsa)

FA_SYSTEM system file

FA_LABEL volume label

FA_DIREC directory

FA_ARCH archive

Constantele de mai sus sunt definite in fila dos.h (necesara la apelare).

Functia returneaza atributul filei,in caz ca a fost executata cu succes,

sau -1 in caz contrar si seteaza variabila errno in caz de eroare.

EXEMPLU: #include

#include

#include

#include

int x;

main()

{ chmod("mesaj.mmm",S_IERITE|S_IREAD);

x=_chmod("mesaj.mmm",1,FA_HIDDEN);

printf(" atributul filei este: %d\n",x);

sleep(3);

}

Fila mesaj.mmm a primit atributul hidden si nu va fi afisata de Windows,

decat daca specificati expres sa afiseze si filele hidden,sau daca

schimbati atributul filei.Schimbati in comanda _chmod() atribuul la

FA_ARCH si repetati exercitiul,apoi verificati prezenta filei.
FUNCTIA chsize()

-modifica dimensiunea filei

SINTAXA GENERALA este: int chsize(int handle,long size);

Functia redimensioneaza fila la dimensiunea precizata prin size.Pentru

identificarea filei,functia solicita codul numeric intern de manipulare

a filei,cel reoprezentat prin handle(valoarea returnata de functiile

creat,open,dup,dup2 etc.).Functia va trunchia sau va extinde fila exis-

tenta pana la valoarea specificata.Atentie sa nu stergeti date importante!

Pentru ca functia sa poata fi apelata,este necesar ca fila sa fie deschisa

cu modul de acces pentru scriere.

Daca fila rezultata va fi mai mare,extinderea se realizeaza prin

adaugarea de caractere NULL (\0).Daca fila rezultata va fi mai mica,toate

datele care urmeaza dupa noul indicator EOF() vor fi sterse(pierdute).

Functia returneaza 0,sau -1 in caz de eroare si seteaza variabila errno

la una dintre valorile: EACCESS(permission denied) EBADF(bad file number)

sau ENOSPC(no space left on device).


-279- [io.h-close(),_close() si _creat() ]

EXEMPLU: #include

#include

#include

#include

#include

int handle,x;

main()

{ handle=open("mesaj.mmm",O_RDWR);

x=chsize(handle,25);

if (x==0)

printf("fila mesaj.mmm a fost redimensionata! \n");

else

print("fila NU A FOST MODIFICATA ! \n");

printf("lungimea filei este de:%d bytes\n",filelength(handle));

sleep(3);

}
FUNCTIA close() si _close()

-inchide o fila

SINTAXA GENERALA este: int close(int handle);

Functia inchide o fila deschisa.Pentru specificarea filei se va utiliza

codul numeric de manipulare interna a filei (handle).Codul este returnat

automat,de oricare dintre functiile: creat,creatnew,creattemp,dup,dup2,

open,_rtl_creat sau _rtl_open.Functia nu adauga Ctrl-Z la sfarsitul filei,

decat daca se specifica explicit un output de acest gen.

Functia returneaza 0 daca a fost executata cu succes,sau -1 in caz contrar

(numarul handle specificat este invalid) si seteaza variabila globala

errno la valoarea EBADF (Bad file numer)

EXEMPLU: #include

#include

#include

#include

int handle;

char text[40]="\nText adaugat in fila mesaj.mmm");

main()

{ handle=open("mesaj.mmm",O_RDWR|O_APPEND);

write(handle,text,40);

close(handle);

printf("Textul a fost adaugat !\n");

sleep(3);

}
FUNCTIA _creat()

-creaza o fila noua

SINTAXA GENERALA este: int _creat(const char *path,int attrib);

Functia este identica cu creat(),cu deosebirea ca deschide intotdeauna

doar file binare si utilizeaza atributele MS-DOS ale filei(attrib) care

sunt definite in ,in locul celor amode definite in .

Functia returneaza codul numeric de manevrare interna a filei(handle) sau

-1 in caz de eroare si seteaza variabila errno la:EACCES,ENOENT sau EMFILE

(vezi si functia creat() )


-280- [ io.h-creatnew() si creattemp() ]

EXEMPLU: #include

#include

main()

{ _creat("mesaj1.mmm",FA_RDONLY);

}

Deschideti directorul TC din USR si verificati daca fila a fost creata.
FUNCTIA creatnew()

-creaza o fila noua

SINTAXA GENERALA este: int creatnew(const char *path,int mode);

Functia este identica cu _creat() si respectiv cu _rtl_creat() cu deo-

sebirea ca in cazul in care exista deja o fila cu numele si calea de

acces specificata,functia returneaza un cod de eroare si lasa fila nemo-

dificata (in loc sa o suprascrie).Functia este mai usor de utilizat,

atunci cand nu stiti exact ce file exista gata create in directorul spe-

cificat(evita suprascrierea accidentala).

Functia returneaza numarul de manipulare (handle),sau -1 in caz de eroare

si seteaza errno la una dintre valorile:EACCES,EEXIST,EMFILE,ENOENT.

EXEMPLU: #include

#include

main()

{ creatnew("mesaj2.mmm",FA_RDONLY);

}

Eventual incercati sa recreati fila mesaj.mmm sau mesaj1.mmm.
FUNCTIA creattemp()

-creaza o fila unica(cu nume generat automat) in directorul specificat

SINTAXA GENERALA este: int creattemp(char *path,int attrib);

Functia genereaza un nume unic si creaza o fila cu numele respectiv in

directorul specificat prin calea de acces.Fila creata va fi de tip O_TEXT,

sau respectiv O_BINARY dupa cum este setata variabila globala _fmode.

Setarea implicita este pentru file de tip text.Pointerul utilizat pentru

calea de acces(variabila),trebuie sa fie suficient de spatios pentru ca

sa cuprinda atat calea de acces descrisa cat si denumirea MS_DOS generata

automat (calea de acces + inca 8 caractere ).Fila creata este garantat cu

nume unic si evita suprascrierea accidentala a unor file preexistente.

Fila nou creata nu este stearsa automat la terminarea programului.Puteti

sterge aceste file in orice alt moment (sunt foarte usor de identificat).

Daca nu specificati calea de acces,filele vor fi create pe unitatea de

disc curenta (de exemplu C:).Fila creata va primi atributele MS-DOS spe-

cificate prin attrib (dintre cele definite in dos.h),care pot fi:

FA_HIDDEN (fila ascunsa),FA_RDONLY(fila read-only) sau FA_SYSTEM(fila sys)

Functia returneaza codul numeric de manipulare al filei (handle) sau -1

in caz de eroare.In caz de eroare seteaza variabila globala errno la

una dintre urmatoarele valori:

EACCES permission denied

EMFILE too many open files

ENOENT path or file name not found

Functia este foarte utila atunci cand se genereaza file cu importanta mai

redusa sau cu viabilitate scurta,dar mai ales atunci cand se utilizeaza

rutine pentru generarea automata a unui numar oarecare de file(bucle FOR).


-281- [ io.h-dup() si dup2() ]

FUNCTIA dup()

-creaza un cod nou pentru manipularea filei(handle)

SINTAXA GENERALA este: int dup(int handle);

Functia creaza un numar nou de manipulare interna a filei(handle).Noul cod

va putea fi utilizat pentru deschiderea aceleiasi file(sau unitate),va

avea atasat acelasi pointer(schimbarea unui pointer va determina automat

si schimbarea celuilalt pointer) si va avea acelasi mod de acces la fila

(read,write,read/write) ca si codul initial.

Functia returneaza noul cod(numeric),daca a fost executata cu succes,sau

-1 in caz contrar.In caz de eroare,seteaza variabila globala errno la

una dintre valorile:EBADF(bad file number) sau EMFILE(too many open files)

EXEMPLU: #include

#include

#include

#include

int x,y;

{ x=open("mesaj.mmm",O_RDWR);

y=dup(x);

printf("primul cod de manipulare este: %d \n",x);

printf("al doilea cod de manipulare este: %d \n",y);

sleep(3);

}

Functia se utilizeaza atunci cand doriti sa puteti deschide o fila prin

mai multe procedee software: Exemplu: primul cod de manipulare se va

utiliza pentru functiile curente(open,etc...),iar cel de al doilea cod

se va utiliza intr-o rutina de deschidere automata a filei in caz de

eroare de editare,eroare de memorie etc.
FUNCTIA dup2()

-creaza un nou cod de manipulare a filei(cel specificat)

SINTAXA GENERALA este: int dup2(int oldhandle,int newhandle);

Functia este similara cu dup(),cu deosebirea ca noul cod va fi cel speci-

ficat prin newhandle,in loc sa fie generat automat(urmatorul disponibil).

Daca fila asociata cu oldhandle,este deschisa in momentul apelarii,fila

va fi inchisa automat(va putea fi redeschisa atat cu oldhandle cat si cu

newhandle).Fila returneaza zero daca a fost executata cu succes sau -1 in

caz contrar si seteaza errno la una din valorile:EBADF sau EMFILE.

EXEMPLU: #include

#include

#include

#include

int x,y;

main()

{ x=open("mesaj.mmm",O_RDWR);

y=dup2(x,x+5);

printf("primul cod de manipulare este: %d \n",x);

if (y==0)

printf("al doilea cod de manipulare este: %d \n",x+5);

else

printf("codul de manipulare nu a fost dublat !");

sleep(3); }


-282- [ io.h -eof() si filelength() ]

FUNCTIA eof()

-verifica daca pozitia cursorului este la sfarsitul filei

SINTAXA GENERALA este: int eof(int handle);

Functia determina daca pozitia cursorului a ajuns la sfarsiutul filei.

Functia returneaza 1 in caz ca pozitia cursorului este la sfarsitul filei,

sau zero in caz contrar.In caz de apelare gresita,functia returneaza -1

si seteaza variabila globala errno la valoarea EBADF (bad file number).

EXEMPLU: #include

#include

#include

#include

char litera,nume[80];

int x;

main()

{ printf("\nIntroduceti numele si extensia filei dorite \n");

scanf("%s",&nume);

x=open(nume,O_RDWR);

do

{ read(x,&litera,1);

printf("%c",litera);

} while(!eof(x));

sleep(5);

close(x);

return 0;

}

Puteti utiliza exemplul de mai sus,pentru a citi datele din orice fila

din directorul TC.Introduceti la inceput fila mesaj.mmm,apoi numele si

extensia oricarei alte file.Puteti utiliza un algoritm similar,in orice

aplicatie in care doriti sa cititi toate datele dintr-o fila.
FUNCTIA filelength()

-determina dimensiunea in bytes a unei file

SINTAXA GENERALA este: long filelength(int handle);

Functia returneaza in bytes,lungimea pentru fila asociata codului handle

(fila manevrata in memoria interna prin codul handle).

Functia returneaza lungimea filei(numar int long) sau -1 in caz de eroare

si seteaza variabila globala errno la valoarea EBADF(bad file number).

EXEMPLU: #include

#include

#include

#include

char nume[80];

int x;

long int lungime;

main()

{ printf("Introduceti numele si extensia filei dorite:\n");

scanf("%s",&nume);

x=open(nume,O_RDWR);

lungime=filelength(x);

printf("\n\n Fila %s ocupa %ld bytes \n",nume,lungime);

sleep(3); }


-283- [ io.h -getftime() si ioctl() ]

FUNCTIA getftime()

-returneaza data si ora la care a fost creata fila

SINTAXA GENERALA este: int getftime(int handle,struct ftime *ftimep);

Functia returneaza data si ora filei manipulata prin codul handle.Datele

preluate se arhiveaza in structura de tip ftime spre care pointeaza poin-

terul *ftimep.Structura ftime este definita in io.h cu forma generala:

struct ftime { unsigned ft_tsec: 5; /*cate doua secunde*/

unsigned ft_min: 6; /*minute*/

unsigned ft_hour: 5; /*ore*/

unsigned ft_day: 5; /*ziua*/

unsigned ft_month: 4 /*luna*/

unsigned ft_year: 7 /*anul-1980*/

};

Functia returneaza zero daca a fost executata cu succes(datele au fost

arhivate) sau -1 in caz contrar,si sereaza variabila globala errno la una

dintre valorile: EACCESS (permision denied) EBADF (bad file number) sau

EINVFNC (invalid function number)

EXEMPLU: #include

#include

#include

#include

char nume[40];

int numar;

struct ftime timp;

main()

{ printf("Introduceti numele si extensia filei: \n");

scanf("%s",&nume);

numar=open(nume,O_RDWR);

getftime(numar,&timp);

printf("Fila %s a fost creata la: \n",nume);

printf("%u/%u/%u \n",timp.ft_hour,timp.ft_min,timp.ft_tsec*2);

printf("la data de: \n");

printf("%u/%u/%u \n",timp.ft_day,timp.ft_month,timp.ft_year+1980);

sleep(5);

}
FUNCTIA ioctl()

-returneaza date despre unitatea I/O (de intrare/iesire a datelor)

SINTAXA GENERALA este:

int ioctl(int handle,int func [,void *argdx,int argcx]);

Functia este destinata pentru interfata de comunicare BIOS a sistemului

DOS.Functia poate fi apelata si din sistemele de operare UNIX ver 7 si

System III,dar semnificatia va fi diferita.Functia nu este portabila intre

DOS si UNIX.Versiunea DOS 3.0 (si urmatoarele) includ si valorile 6 si 8

pentru parametrul func.

Functia apeleaza direct interfata DOS,la fel ca si apelul DOS call 0x44.

Functia poate fi utilizata pentru a solicita date despre filele obisnuite,

sau despre porturile de comunicatie ale unitatii specificate.Pentru filele

obisnuite se pot utiliza doar parametrii 0,6,si 7 din func.

Pentru relatii suplimentare consultati apelul call 0x44 din manualul

versiunii de DOS pe care o utilizati (probabil DOS 7 sau MS_DOS).


-284- [ io.h -ioctl() ]

Valoarea returnata depinde de parametrul func,dupa cum urmeaza:

0 -returneaza unitatea (device)

1 -seteaza unitatea

2 -citeste argcx bytes in adresa pointata prin argdx

3 -scrie argcx bytes din adresa pointata prin argdx

4 -la fel ca 2 dar handle va fi interpretat ca numar al unitatii

(0=default,1=A,2=B etc.)

5 -la fel ca 3 dar handle va fi interpretat ca numar al unitatii

6 -returneaza statusul pentru intrari(input)

7 -returneaza statusul pentru iesiri(output)

8 -Testeaza removabilitatea (DOS 3 si urmatoarele)

11 -Seteaza timpul pentru repetarea solicitarii,in cazul conflicte-

lor de partajare

Argumetele argdx si argcx sunt optionale.

Functia ioctl realizeaza o interfata directa cu BIOS-ul din sistemul DOS.

Rezultatul returnat este diferit de la o varianta de DOS la alta.Pentru

rezultate exacte,consultati manualul sistemului de operare cu care lucrati

Pentru func 0 si 1,functia returneaza informatii despre unitatea de lucru

(adresa Dx apelata prin ioctl).Pentru func 2-5,functia returneaza numarul

de bytes transferati de la o adresa la alta,iar pentru func 6 si 7,functia

returneaza statusul unitatii(codul).Pentru func 8,functia returneaza codul

(0,1 sau 2) iar prin func 11 se seteaza numarul de secunde pana la o noua

tentativa de a partaja o fila (presupunand ca exista SHARE.EXE).

In caz de eroare,functia returneaza -1 si seteaza variabila globala errno

la una dintre valorile: EBADF(bad file number),EINVAL(invalid argument)

sau EINVDAT(invalid data).

EXEMPLU: #include

#include

#include

#include

int handle,status1,status2,drive,unitate;

int adresa;

main()

{ handle=open("mesaj.mmm",O_RDWR);

status1=ioctl(handle,6);

status2=ioctl(handle,7);

drive=ioctl(0,8);

printf("Pentru fila mesaj.mmm: \n");

printf("statusul de intrare este: %d \n",status1);

printf("iar cel de iesire este: %d \n",status2);

printf("DEVICE=%d \n",drive);

sleep(3);

}

Este bine sa nu apelati aceasta functie,decat daca stiti exact ce date

sunt arhivate in adresele de DOS specificate si ce rezultat obtineti,in

caz contrar riscati sa schimbati registrii sistemului de operare pentru

functiile I/O si sa ramaneti fara imagine.Puteti utiliza functia fara

nici o restrictie pentru a solicita informatii,fie despre o fila oarecare,

fie despre unitatea de disc actuala(hard disc,discheta etc.).

Evitati sa includeti functia in rutine automate,deoarece riscati sa obti-

neti rezultate imprevizibile.


-285- [ io.h -isatty() si lock() ]

FUNCTIA isatty()

-verifica tipul de unitate

SINTAXA GENERALA este: int isatty(int handle);

Functia verifica daca unitatea specificata prin numarul de manipulare

interna handle este de tip:terminal,consola,imprimanta sau port serial.

Functia returneaza nonzero daca unitatea este unul din tipurile de mai

sus,sau zero in caz contrar(de exemplu: -port paralel).

EXEMPLU: #include

#include

#include

#include

int numar1,numar2,numar3,x;

main()

{ numar1=open("mesaj.mmm",O_RDWR);

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   34   35   36   37   38   39   40   41   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin