Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Exemple de utilizare a functiilor de intrare/iesire de nivel inferior

c



+ Font mai mare | - Font mai mic



Exemple de utilizare a functiilor de intrare/iesire de nivel inferior

1. Sa se scrie un program care copiaza intrarea standard la iesirea standard.



Aceasta problema se poate rezolva usor prin folosirea functiilor getchar si putchar. Acum o vom rezolva folosind functiile _read si _write.

# include <stdio.h>

# include <io.h>

void main() /* copiaza intrarea standard la iesirea standard */

Mentionam ca cel de-al doilea parametru al functiei _read sau _write trebuie sa fie pointer spre caractere.

Lucrul la nivelul inferior nu este chiar atat de simplu pe cat pare. Vom ilustra in continuare responsabilitatea pe care o are programatorul in gestionarea zonelor tampon. Sa consideram exemplul anterior in care zona tampon o marim la 3 caractere, deci programul arata astfel:

# include <stdio.h>

# include <io.h>

void main()

Citirea nu se va opri dupa 3 caractere, ci functia _read va continua sa functioneze pana la tastarea ENTER (CR+LF). Imediat functia _read va tipari grupele de 3 caractere introduse, inclusiv grupul final CR+LF. Zona tampon definita este suprainscrisa de fiecare data cand se introduc noi caractere.

Daca de la tastatura vom introduce

123456<CR><LF>

atunci se va tipari primul grup (prima inscriere a zonei tampon) 123, apoi a doua grupa 456 si grupul <CR> si <LF> va suprainscrie primele doua caractere ale bufferului, anume codurile ASCII ale lui 4 si 5 si se va tipari <CR><LF>6.

123456

123456

6

Primul grup 123456 este scris prin ecou de la tastatura, iar urmatoru se inscrie de catre program. Daca in continuare vom introduce 1<ENTER> atunci se va tipari 1 urmat de doua randuri noi deoarece fiecare CR sau LF sunt expandate de stdout in perechi <CR><LF>.

Daca marim la 5 dimensiunea bufferului si de la tastatura introducem 12<ENTER>, atunci se va tipari

12

12

deoarece cel de-al 5-lea octet al bufferului nu a fost alocat prin citire, avand o valoare nedefinita.

Problemele de mai sus legate de gestiunea bufferului in/din care se face citirea/scrierea pot fi depasite cu o modificare simpla, prezentata mai jos. Prin scriere nu se vor trimite spre stdout decat numarul de caractere citit de la stdin.

# include <stdio.h>

# include <io.h>

# define LZT 10 // lungime zona tampon

void main() /* copiaza intrarea standard la iesirea standard */

Programatorul trebuie sa tina cont insa si de alte amanunte cum ar fi dimensiunea implicita a bufferului stdin, care este de 254 de caractere.

2. Sa se scrie un program care citeste un sir de numere flotante de la intrarea standard si creaza 2 fisiere fis1.dat si fis2.dat, primul continand numerele de ordin impar citite de la intrarea standard (primul, al 3-lea, al 5-lea, etc.) iar cel de-al doilea pe cele de ordin par citite de la aceeasi intrare. Apoi sa se listeze, la iesirea standard, cele doua fisiere in ordinea fis1.dat, fis2.dat cate un numar pe un rand in formatul

numar de ordine: numar

Vom scrie programul folosindu-ne de functii definite de utilizator care sa faca apel la functiile de nivel inferior. Programul arata astfel:

# include <stdio.h>

# include <io.h>

# include <sys/types.h>

# include <sys/stat.h>

# include <fcntl.h>

#include <stdlib.h>

char nume1[]='fis1.dat';

char nume2[]='fis2.dat';

union unr ;

union unr nrcit;

int creare_fis(const char *nume)

return df;}

void scrie_fis(int df,char *nume)

void date_fis(int df1,char *nume1,int df2,char *nume2)

void inchid_fis(int df, char *nume)

int deschid_fis_cit(char *nume)

return df;}

void list_fis(int df,char *nume,int ord)

if (i<0)

_close(df);}

void main()

3. Sa se realizeze programul de mai sus folosind un singur fisier fis.dat.

Programul va diferi fata de cel anterior prin faptul ca inregistrarile se stocheaza intr-un singur fisier, deci functia de listare se va modifica pentru citirea din 2 in 2 a inregistrarilor. Dupa fiecare citire din fisier, se va face un salt cu o inregistrare pentru a pozitiona capul de citire/scriere peste inregistrarea urmatoare.

# include <stdio.h>

# include <io.h>

# include <sys/types.h>

# include <sys/stat.h>

# include <fcntl.h>

#include <stdlib.h>

char nume[]='fis.dat';

union unr ;

union unr nrcit;

int creare_fis(const char *nume)

return df;}

void scrie_fis(int df,char *nume)

void date_fis(int df,char *nume)

void inchid_fis(int df, char *nume)

int deschid_fis_cit(char *nume)

return df;}

void list_fis(int df,char *nume)

if (i<0)

j=2;

// pozitionare pe prima inregistrare

_lseek(df,0l,0);

// avans la inregistrarea a doua

_lseek(df,(long)sizeof(float),1);

while((i=_read(df,nrcit.tnr,sizeof(float)))>0)

if (i<0)

_close(df);}

void main()

Atragem atentia asupra modului in care lucreaza functiile de intrare/iesire pentru stdin si stdout fata de cele pentru disc. Daca intrarile si iesirile pentru perifericele standard le putem executa in formatul dorit cu ajutorul functiilor specializate scanf si printf, pentru lucrul cu discul variabila float este tratata sub forma unui grup de 4 octeti care se scriu sau se citesc pe disc asa cum este reprezentarea lor interna. Exista functii specializate pentru scrierea/citirea pe disc cu format, dar care sunt de nivel superior.

Ceea ce merita sa subliniem este faptul ca echivalentele de nivel superior pentru fisiere ale functiilor printf() si scanf() sunt fprintf() si fscanf(). Echipamentele periferice pot fi considerate fisiere externe si deci functiile specializate pentru I/O cu fisiere pot fi folosite si pentru operatii de I/O cu echipamentele periferice. Functiile printf si scanf sunt proiectate pentru a lucra implicit cu fisierele stdout respectiv stdin, deci cu monitorul si tastatura.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 788
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved