|
}
Verificati fisierul mesaj.mmm,sau orice alta fila din directorul TC(una
|
səhifə | 38/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| }
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);
Dostları ilə paylaş: |
|
|