Sunteți pe pagina 1din 9

Universitatea Tehnică a Moldovei

FCIM
Catedra Informatica Aplicativă

RAPORT
la lucrarea de laborator nr. 3

Varianta 24

la SDA

Tema: “Fisiere”

A efectuat: st. gr. Ti-161 Trifan Iulian

A verificat: Marin Ştefan


Sarcina şi obiectivele:
• să se analizeze principiile organizării şi gestiunii fişierelor în sistemele de operare şi procesarea fişierelor
în limbajul C, apoi şi să se analizeze algoritmii şi programele (declarări, utilizări, parcurgeri, salvare şi
ştergeri). Pentru aprofundarea şi rularea programelor în limbajul C să se elaboreze scenariile succinte de
soluţionare cu calculele de verificare şi explicaţii.
• de studiat şi însuşit materialul teoretic prin lansarea exerciţiilor de antrenament [4] şi verificări ale
cunoştinţelor (din indicaţiile acestea) şi să se elaboreze algoritmii şi, totodată, să organizeze calculele de
verificare cu explicaţii pentru evidenţierea esenţialului prelucrării fişierelor cu structuri de date în
elaborarea modelelor soluţiei. Toate observaţiile se înregistrează în raport;
• să se preia de la profesor varianta (5. Variante pentru lucrul individual) şi să se elaboreze algoritmii şi şi
programul unde să organizeze antetul functiilor şi transmiterea functiei apelate adresele variabilelor cu
calculele de verificare şi cu explicaţii la prelucrarea fişierelor.
• în baza funcţiilor de timp şi dată din fişierul header time.h apreciaţi timpul definit de sistem şi timpul
execuţiei programului în secunde pentru ambele cazuri (tradiţional şi cu pointeri) şi să se descrie
scenariile şi principiile de algoritmizare si rezolvare ale problemei în baza diferitor modele de SD
complexe, implementând subprograme în C;
• în raport să se reflecte toate exemplele efectuate cu analize a tehnicii programării eficiente cu
argumentări şi comentarii, incluzând fişierele cu teste de verificare şi vizualizări ale rezultatelor.
Consideraţii teoretice:
1. Organizarea şi gestiunea fişierelor în sistemele de operare (SO).
Tratarea informaţiilor cere prezenţa lor în memorie în timpul execuţiei programului dat. Dar în majoritatea
cazurilor trebuie neapărat ca aceste informaţii să fie conservate de o manieră durabilă .Ca exemplu elementar
, se poate de citat informaţiile relative ale clienţilor unor întreprinderi. De aceleaşi date (cod, client, numele
clientului, adresa ,cifra de afaceri ), sunt cele mai des exploatate pe o perioadă lungă de timp. Ele trebuie să
fie rechemate la moment şi în particular. În acest scop ele sunt scrise într-un fişier, care este stocat pe o
memorie masivă (discul magnetic) şi accesibil programului, manipulând informaţiile.
Un fişier nu este altceva decât o mulţime mai mult sau mai puţin importante de date, conservate pe un
oarecare suport.
Fişierele pot fi cu acces direct (stocate pe disc) sau cu acces secvenţial (stocate pe bandă). Numele
fişierelor are structura: numefişer.extensia.
SO UNIX suportă aşa-numitele fişiere conductă ("pipes") care pot fi deschise de două procese pentru
a stabili un canal de comunicaţie interproces.
Fişierele sunt împărţite în tipuri diferite în funcţie de utilizarea lor. Diferenţierea tipurilor se face prin
extensii diferite a numelui fişierului. De exemplu:
FILE.C; FILE.CPP: program - sursă în C/C++;
FILE.PAS: program - sursă în Pascal;
FILE.FTN: program - sursă în Fortran;
FILE.OBJ: fişier - obiect, rezultat în urma compilării;
FILE.BIN: program executabil (în mod binar);
FILE.DAT: fişier de date, etc.
Uneori extensia este o simplă convenţie, sistemul de operare neţinând cont de aceasta.
1.1. ORGANIZAREA SISTEMELOR DE FIŞIERE
Organizarea fişierelor este specifică fiecărui sistem de operare.
În sistemul de operare UNIX, fişierele sunt organizate în arborele unic al fişierelor, existând o singura rădăcină.
Acest sistem de operare tratează egal fişiere sau dispozitive.
În sistemul de operare MS-DOS există nume de dispozitive (ex.: A,B,C). Dispozitivele de disc permit
organizări arborescente.
Simplificarea accesului a dus la apariţia conceptului de directoare. Un director este un fişier de indicare a
localizării celorlalte fişiere. Un director e organizat pe înregistrări (articole), câte una pentru fiecare fişier; fiecare articol
conţine informaţii despre fişier ca: nume, tip, dimensiune, timp etc. La CP/M directorul conţinea şi numerele de ordine
ale blocurilor alocate. Fişierul este localizat prin cale (path), care precizează locul în arbore.
1.2 GESTIUNEA SPAŢIULUI PE DISC
Gestiunea spaţiului pe disc nu se face pe sectoare fizice; există unităţi de alocare, fiecare unitate conţinând un
multiplu de sectoare fizice, oferind flexibilitate la schimbarea dispozitivului. Contabilizarea sectoarelor ocupate se
realizează in doua moduri:
1. lista înlănţuită, care conţine unităţi de 16 biţi pe care se înregistrează numărul de blocuri ocupate succesiv;
2. bit-map, în care primul bit are semnificaţia de ocupat / neocupat.
Sistemul MS-DOS foloseşte listele înlănţuite (fiecare bloc conţine doi octeţi ce reprezintă un pointer către
următorul bloc din lanţ), ceea ce permite întreţinerea rapidă la eliberare/alocare spaţii pentru fişiere. La ştergere,
dispar înregistrările de 16 biţi corespunzătoare blocurilor fişierelor. La alocare, se ocupa în măsura găsirii spaţiilor
neînregistrate în FAT.
Sistemul UNIX înlatură dezavantajul fişierelor mari cu unităţi multe de alocare, care necesită un FAT mare in
sistemul MS-DOS astfel: se utilizează gestiunea spaţiului pe disc cu I-noduri (Index-nod). Fiecare fişier are un I-nod
(indiferent de dimensiunea fişierului respectiv).

1.5 STOCAREA FIŞIERELOR


Un fişier este memorat pe un anumit mediu într-o secvenţă de blocuri care trebuie gestionată de sistem.
Stocarea consecutivă a acestor blocuri nu este un lucru fezabil.
O metodă realizabilă este stocarea blocurilor într-o listă înlănţuită. Există două dezavantaje:
1. Nmărul octeţilor de date nu mai este o putere a lui 2;
2. Accesul aleator este scump de implementat.
Totuşi ideea de reprezentare a fişierelor ca o listă înlînăuită s-a păstrat, însă pointerii sunt stocaţi în memorie. Se
asociază fiecărui disc o tabelă de alocare de fişiere (FAT). FAT-ul are o intrare pentru fiecare bloc de pe disc. Intrarea
directorului pentru fiecare fişier primeşte numărul primului bloc de pe disc al fişierului. Mai departe slotul din FAT
corespunzător fiecărui bloc conţine numărul blocului următor.
Acest model a fost utilizat pe discuri floppy pentru discuri floppy de 360 k cu dimensiunea blocului de 1 k.
Numărul de identificare al blocului este de 12 biţi existând deci 480 de octeţi în FAT.
Principala problemă a FAT-ului este că pointerii tuturor fişierelor de pe întreg discul sunt mixate aleator
în această tabelă. Deci e nevoie de întreg FAT-ul chiar dacă un singur fişier este deschis. O metodă mai bună ar fi
păstrarea mai multor liste de blocuri pentru fişiere diferite în locuri diferite. Această metodă este folosită de UNIX,
unde fiecare fişier are asociată o mică tabelă (pe disc) numită I-node. Fiecare I-nod conţine pointeri către 10 blocuri de
date de pe disc plus încă 3 pointeri indirecţi.

I-NOD spre blocuri


de date
atribute
10 pointeri spre blocuri
de date
la blocuri
point. simplu
spre blocuri
point. dublu de date
point. triplu

spre blocuri
de date
Pentru primele 10 blocuri din fişier adresele sunt trecute chiar în i-nod, fiind foarte uşor de accesat. Pentru fişiere
mai lungi de 10 blocuri se alocă un bloc de pointeri pe disc ce va fi accesat prin intermediul primului pointer indirect.
Pointerul dublu către blocuri de pointeri ce pointează la blocuri de pointeri către blocuri de date. Pointerul triplu
acţionează după un raţionament similar. Doar cu ajutorul pointerului dublu pot fi accesaţi 64 kblocuri.
Esenţial la acest sistem este faptul că blocurile de pointeri indirecţi sunt utilizate (încărcate în memorie) doar dacă
este necesar, făcându-se cel mult trei referinţe la disc oricât de lung ar fi fişierul.

4. Exemple de verificare a cunoştinţelor însuşite: în listingul programelor de mai jos verificaţi


corectitudinea, scopul şi rezultatele:
4.1. Listingul programului:
#include<conio.h>
#include<stdio.h>
#include<string.h>
void main() {clrscr(); int i,n;
FILE *f;
f=fopen("d:\\input.txt","r");
char *s,**s1,*aux;
fgets(s,1000,f);
for(i=0,n=0;i<strlen(s);i++) if((s[i]=='.')||(s[i]=='!')) n++;
s1[0]=strtok(s,".!");
for(i=1;i<n;i++) s1[i]=strtok(NULL,".!");
aux=s1[0]; s1[0]=s1[2]; s1[2]=aux;
for(i=0;i<n;i++)printf("%s. ",s1[i]);
fclose(f);
getch();
}

Programul dat va citi dintr-un fisier of propozitie delimitata prin punct s-au semnul exclamarii
va interschimba primul cuvint cu al treilea si va afisa cuvintele dupa interschimbare.
Greaseala programului este ca variabilele s,s1 trebuiesc alocati dinamic s-au de inlocuit
cu variabile statice(tablou si matrice).

Programul corect:

1. #include<conio.h>
2. #include<stdio.h>
3. #include<string.h>
4. #include<stdlib.h>
5. int main() { int i,n;
6. FILE *f;
7. f=fopen("input.txt","r");
8. char *s,**s1,*aux;
9. s = (char*)malloc(sizeof(char)*1000);
10. fgets(s,1000,f);
11. for(i=0,n=0;i<strlen(s);i++) if((s[i]=='.')||(s[i]=='!')) n++;
12. s1 = (char**)malloc(sizeof(char*)*n);
13. for(i = 0 ; i < n ; ++i)
14. s1[i] = (char*)malloc(sizeof(char)*20);
15. s1[0]=strtok(s,".!");
16. for(i=1;i<n;i++) s1[i]=strtok(NULL,".!");
17. aux=s1[0]; s1[0]=s1[2]; s1[2]=aux;
18. for(i=0;i<n;i++)printf("%s ",s1[i]);
19. fclose(f);
20. getch();
21. }

27. Să se scrie programul care creează un fişier text în care se memorează două matrice, astfel: pe
prima linie numărul de linii şi numărul de coloane ale primei matrice, separate printr-un spaţiu; pe
fiecare din liniile următoare, în ordine, elementele unei linii din matrice, separate prin cîte un spaţiu;
în continuare a doua matrice, în aceeaşi formă.. Apoi de afişat.

Listingul Programului:

1. #include<conio.h>
2. #include<stdio.h>
3. #include<string.h>
4. #include<stdlib.h>
5.
6. int main()
7. {
8.
9. system("cls");
10. int A[10][10],N,M,i,j,k;
11. FILE *f = fopen("input.txt","w");
12. for(k = 1 ; k <= 2 ; ++k){
13. printf("Dati numarul de linii si coloane:");
14. scanf("%d%d",&N,&M);
15. fprintf(f,"%d %d\n",N,M);
16. for(i = 1 ; i <= N ; ++i){
17. for(j = 1 ; j <= M ; ++j){
18. printf("Dati A[%d][%d]:",i,j);
19. scanf("%d",&A[i][j]);
20. fprintf(f,"%d ",A[i][j]);
21. }
22. fprintf(f,"\n");
23. }
24. }
25. fclose(f);
26. system("cls");
27. f = fopen("input.txt","r");
28. for(k = 1 ; k <= 2 ; ++k){
29. fscanf(f,"%d%d",&N,&M);
30. printf("%d %d\n",M,N);
31. for(i = 1 ; i <= N ; ++i){
32. for(j = 1 ; j <= M ; ++j){
33. fscanf(f,"%d",&A[i][j]);
34. printf("%d ",A[i][j]);
35. }
36. printf("\n");
37. }
38. }
39. fclose(f);
40. }

Problema 24:
Sa se scrie un fisier de comenzi care are ca parametri doua cuvinte si o
lista de fisiere. Sa se construiasca un fisier prin concatenarea fisierelor
din lista dupa ce se aplica urmatoarele modificari: pentru fisierele de
rang impar din lista se vor inlocui toate aparitiile primului cuvant cu al
doilea, iar pentru fisierele de rang par, se va inlocui aparitiele din fiecare
linie a celui de-al doilea cuvant cu primul.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHARS 256

typedef char string[MAX_CHARS+1];

void newFile(string file[],FILE* destination);

string words[2];

int main(int argc, char *argv[]) {

////////////Write the commands file


int i,numFiles;

FILE *fCommands;
fCommands=fopen("comenzi.txt",
"w+");
if(fCommands==NULL){
perror("Eroare la deschiderea
fisierului!");
return(-1);
}
printf("Introduceti doua cuvinte:\n");
for(i=0;i<2;i++){
scanf("%s",&words[i]);

fprintf(fCommands,"%s\n",words[i]);
}
printf("Introduceti numarul de fisiere
pentru prelucrare:\n");
scanf("%d",&numFiles);
string files[numFiles];
for(i=0;i<numFiles;i++){
scanf("%s",&files[i]);
fprintf(fCommands,"%s\n",files[i]);
}
fclose(fCommands);

////////////Write the newly file

FILE *fNew;
fNew=fopen("newFile.txt", "w+");
if(fNew==NULL){
perror("Eroare la deschiderea
fisierului!");
return(-1);
}
for(i=0;i<numFiles;i++)
newFile(files,fNew);

return 0;
}
void newFile(string file[],FILE* destination){
char buff[256],ch;
string gotWords[20];
int i,j;
static int id=0;
FILE *f;
f=fopen(file[id],"r");
if((id+1) % 2!=0){
while(!feof(f)){
fscanf(f,"%s",buff);
if(strcmp(buff,words[0])==0){
if((ch=fgetc(f))!='\n'){

fprintf(destination,"%s ",words[1]);
}else{

fprintf(destination,"%s\n",words[1]);
}
}else{
if((ch=fgetc(f))!='\n'){

fprintf(destination,"%s ",buff);
}else{

fprintf(destination,"%s\n",buff);
}
}
}
fprintf(destination,"%c",'\n');
}else{
while(!feof(f)){
fscanf(f,"%s",buff);
if(strcmp(buff,words[1])==0){
if((ch=fgetc(f))!='\n'){

fprintf(destination,"%s ",words[0]);
}else{

fprintf(destination,"%s\n",words[0]);
}
}else{
if((ch=fgetc(f))!='\n'){

fprintf(destination,"%s ",buff);
}else{

fprintf(destination,"%s\n",buff);
}
}
}
}
id++;
fclose(f);
}

S-ar putea să vă placă și