Sunteți pe pagina 1din 16

6

Fiiere
Toate programele scrise pn acum au fost interactive, primindu-i datele de intrare de la
tastatur, iar afiarea rezultatelor s-a fcut ntotdeauna pe ecran. De multe ori ns, cnd volumul
datelor de intrare este mare sau formatul lor complicat, este de dorit ca acestea s fie editate
nainte de rularea programului i salvate ntr-un fiier de unde s fie preluate de program n timpul
execuiei. n acest fel, nu mai este nevoie ca datele s fie reintroduse de fiecare dat cnd se
execut programul. De asemenea, rezultatele calculate de un program pot s fie scrise ntr-un
fiier. n acest fel, rezultatele unui program pot fi imediat utilizate ca date de intrare pentru alt
program.
n general, prin fiier se nelege o colecie ordonat de nregistrri care sunt pstrate pe
diferite suporturi externe (n general discuri). Un fiier are o nregistrare care marcheaz sfritul
de fiier. Sfritul de fiier poate fi referit prin constanta simbolic EOF (End Of File).
Prelucrarea fiierelor prin program implic de obicei o secven de operaii specifice. Orice
fiier trebuie deschis nainte de a putea fi prelucrat. Prelucrrile care se fac cel mai frecvent asupra
fiierelor sunt consultarea ( citirea nregistrrilor din fiier) i crearea sau actualizarea fiierului
prin scrierea de noi nregistrri n fiier. La sfritul prelucrrilor, fiierul trebuie nchis. Toate
aceste operaii se realizeaz prin funcii din biblioteca standard a limbajului C.
Prelucrarea fiierelor n limbajul C se poate face la dou nivele: nivelul inferior de
prelucrare a fiierelor, care utilizeaz direct funcii ale sistemului de operare, i nivelul superior de
prelucrare care conine funcii specializate specifice limbajului C. n acest capitol vor fi tratate
doar funciile de prelucrare a fiierelor din aceast ultim categorie. Aceste funcii ofer mai multe
faciliti dect funciile de nivel inferior i sunt mai uor de utilizat.
n funcie de modul de interpretare a datelor, fiierele pot fi prelucrate ca fiiere text sau ca i
fiiere binare.

115

6.1 Fiiere text


6.1.1 Redirectarea intrrii i ieirii standard
Datele introduse de la un terminal se consider c formeaz fiierul standard de intrare. n
mod analog, datele care se afieaz pe terminal se consider c formeaz fiierul standard de
ieire. n cazul fiierelor de intrare de la tastatur, sfritul de fiier se genereaz prin <CTRL>Z.
Intrarea i ieirea standard pot fi redirectate. n felul acesta, toate funciile de intrare-ieire
din biblioteca stdio (scanf, printf, putchar, getchar, etc.) pot fi folosite pentru a
realiza operaii de intrare-ieire cu alte periferice dect terminalul standard. Se poate redirecta
ieirea standard, n loc de afiare pe ecran, spre un fiier de pe disc.
De exemplu, dac avem un program n fiierul executabil prog.exe, acesta poate fi
lansat n execuie din linia de comand, cu redirectarea ieirii n fisierul fis_out n felul
urmtor:
prog > fis_out
Redirectarea intrrii din fiierul fis_in se face:
prog < fis_in
Redirectarea ieirii unui program prog1 ca intrare pentru un alt program prog2:
prog1|prog2
Programul 6.1: Redirectarea intrrii i ieirii standard. Programul copiaza.c realizeaz
copierea, caracter cu caracter, a intrrii standard la ieirea standard. Programul poate fi folosit
pentru realizarea unei copii a unui fiier f1, dac intrarea standard a programului e redirectat ctre
acesta, iar ieirea standard ctre fiierul copie care se creaz.
/* copiaza.c */
#include <stdio.h>
void main() {
int c;
while ((c=getchar())!=EOF)
putchar(c);
}
n linia de comand, se va da comanda:

116

copiaza <f1 >copie


Rezultatul va fi crearea fiierului cu numele copie, avnd acelai coninut ca i fiierul f1.

6.1.2 Deschiderea unui fiier


Redirectarea intrrii i ieirii standard, descris n paragraful anterior, este o metod simpl
de a face un program s lucreze cu fiiere. De multe ori ns este nevoie ca un program s lucreze
simultan att cu intrarea i cu ieirea standard ct i cu mai multe fiiere din care citete i n care
scrie scrie date. n acest caz, lucrul cu fiiere trebuie specificat n program.
La nivelul utilizatorului i al sistemului de operare, un fiier este identificat prin numele
su. La nivelul interfeei de programare C, un fiier este referit printr-o structur de tip FILE cu
informaiile necesare pentru accesul la fiier. Pentru a putea manipula un fiier prin program,
trebuie s se realizeze mai nti operaia de deschidere a fiierului, operaie care asociaz numelui
fiierului o structur de tip FILE i l pregtete pentru prelucrri ulterioare.
Pentru deschiderea unui fiier se utilizeaz funcia fopen:
FILE * fopen(char * nume,

char * mod);

Parametrii acestei funcii sunt:


nume = un ir de caractere care reprezint numele fiierului. Numele poate include i
specificarea cii.
mod = un ir de caractere care definete modul de prelucrare a fiierului dup deschidere.
Posibilele valori ale acestui parametru sunt: r w a r+.
Modul r (read) nseamn deschiderea fiierului cu numele specificat pentru citire. Dac
se ncearc deschiderea n modul r a unui fiier inexistent, funcia fopen va returna pointerul
NULL.
Modurile w (write) i a (append) nseamn deschiderea fiierului pentru scriere. Dac
se deschide un fiier inexistent cu modul w sau a atunci acesta este creat. Dac se deschide un
fiier existent cu modul w coninutul vechi al fiierului se pierde i fiierul este rescris, n timp
ce cu modul a se scrie n continuarea vechiului coninut.
Pentru fiiere binare, se adaug caracterul b la specificarea modului de prelucrare: rb
wb ab r+b.
ntotdeauna trebuie s se testeze dac rezultatul operaiei de deschidere este un pointer
nenul. Dac rezultatul este pointerul NULL nseamn c deschiderea fiierului nu a reuit i nu pot
fi efectuate prelucrri ulterioare asupra sa.

117

De exemplu, dac se dorete deschiderea fiierului date.txt pentru citire, se poate utiliza o
secven ca i cea de mai jos:
FILE *fs;
...
if ((fs=fopen("date.txt", "r"))==NULL) {
printf("nu se poate deschide fisierul !\n");
exit(1);
}
Exist variabilele predefinite stdin, stdout, stderr care sunt pointeri spre tipul FILE
i permit ca funciile de nivel superior de prelucrare a fiierelor s poat trata intrarea standard,
ieirea standard i ieirea standard pentru erori la fel ca i restul fiierelor. Singura deosebire e c
programatorul nu trebuie s deschid sau s nchid aceste fiiere, ele fiind deschise automat la
lansarea n execuie a programului i nchise la apelul funciei exit la terminarea programului.

6.1.3 nchiderea unui fiier


Dup terminarea prelucrrii unui fiier acesta trebuie nchis. Se recomand ca
programatorul s nchid orice fiier de ndat ce s-a terminat prelucrarea lui, deoarece numrul de
fiiere ce poate fi deschis simultan e limitat de sistemul de operare.
int fclose(FILE * pf);
Parametrul acestei funcii, FILE * pf este un pointer ctre structura FILE care a fost
obinut la deschiderea fiierului. Funcia returneaz valoarea 0 dac operaia a decurs normal sau 1 dac operaia nu a reuit.

6.1.4 Prelucrarea pe caractere a unui fiier


Cele mai simple funcii de prelucrare a fiierelor sunt cele pe caractere, getc i putc.
int getc(FILE * pf);
int putc(int c, FILE * pf);
Funciile primesc ca i parametru un pointer pf la un fiier deschis n modul
corespunztor: pf trebuie s fi fost deschis pentru citire (n modul r) pentru getc, respectiv
pentru scriere (n modul w sau a) pentru putc.
Funcia getc returneaz urmtorul caracter din fiierul indicat ca i parametru. n caz de
eroare sau cnd ajunge la sfritul fiierului returneaz valoarea EOF.
Funcia putc scrie caracterul c n fiierul indicat de parametrul pf i returneaz
caracterul scris sau EOF n caz de eroare.
118

Funciile cunoscute getchar i putchar pentru citirea unui caracter de la tastatur,


respectiv pentru afiarea unui caracter, sunt de fapt apeluri ale acestor funcii mai generale:
getchar este echivalent cu getc(stdin) iar putchar(c) este echivalent cu
putc(c, stdout). Getchar i putchar sunt realizate ca simple macrodefiniii pornind de
la getc i putc.
Programul 6.2: Un program care creaz un fiier copie caracter cu caracter a unui alt fiier dat.
Programul copiaz fiierul cu numele nume_sursa, creand fiierul cu numele nume_dest.
Se declar doi pointeri de tip FILE, fs i fd, pentru prelucrarea acestor dou fiiere.
Fiierul surs fs este deschis n mod r pentru citire, iar fiierul copie fd este deschis n modul
w pentru scriere. Dac a existat anterior un alt fiier cu acelai nume nume_dest acesta va fi
rescris. Pentru fiecare operaie de deschidere de fiier se verific faptul c operaia a reuit
(pointerul la FILE returnat este diferit de NULL).
#include <stdio.h>
#include <stdlib.h>
void main() {
int c;
char nume_sursa[80], nume_dest[80];
FILE *fs,*fd;
printf("Introduceti numele fisierului sursa \n");
gets(nume_sursa);
printf("Introduceti numele fisierului copie\n");
gets(nume_dest);
if ((fs=fopen(nume_sursa, "r"))==NULL) {
printf("Nu se poate deschide fisierul %s \n",
nume_sursa);
exit(1);
}
if ((fd=fopen(nume_dest, "w"))==NULL) {
printf("Nu se poate deschide fisierul %s \n",
nume_dest);
exit(1);
}
while ((c=getc(fs))!=EOF)
putc(c, fd);
fclose(fs);
fclose(fd);
}

119

Copierea se face citind cte un caracter din fiierul fs, atta timp ct acesta este diferit de
marcajul de sfrit de fiier, EOF. Caracterul este imediat scris n fiierul fd. La sfrit se nchid
ambele fiiere.

6.1.5 Aplicaii de prelucrare a textelor


Numeroase aplicaii necesit o procesare a textelor. Exemplul urmtor ilustreaz o manier
simpl de analiz a unui text.
Programul 6.3: S se scrie un program care citete un text coninut ntr-un fiier i afieaz
fiecare cuvnt ntlnit pe o nou linie pe ecran. Se consider c dou cuvinte pot fi desprite
printr-un numr oarecare de separatori. Separatorii sunt caracterele spaiu, tab i linie nou. Orice
alt grupare de caractere se consider a fi un cuvnt.
Se definesc funciile separator i incuvant care testeaz dac un caracter dat este
separator sau poate face parte din cuvinte.
Principiul algoritmului de gsire a cuvintelor, realizat de funcia cuvinte, este urmtorul:
atata timp cat nu s-a terminat fisierul
* elimina separatorii
* colecteaza caracterele unui cuvant
Programul este dat n continuare:
#include <stdio.h>
#include <stdlib.h>
#define MAXLIT 80
int separator(char c) {
/* testeaza daca c este separator */
if ((c==' ')||(c=='\t')||(c=='\n')) return 1;
return 0;
}
int incuvant(char c) {
/* testeaza daca c poate apare in interiorul unui cuvant */
return
}

!separator(c);

120

void cuvinte(FILE * fp){


char s[MAXLIT], c;
int l;
c=getc(fp);
while (c!=EOF) {
while (separator(c)) {
/* elimina separatorii */
c=getc(fp);
}
if (c=EOF)
break;
/* incepe un cuvant */
l=0; /* initializeaza contorul literelor */
while ((c!=EOF)&&incuvant(c)) {
s[l++]=c; /* depune litera */
c=getc(fp);
}
s[l]='\0'; /* depune terminatorul de sir */
printf("Cuvantul: %s \n", s);
}
}
void main(void) {
char numefis[80];
FILE *fp;
printf("Introduceti numele fisierului \n");
scanf("%80s", numefis);
if ((fp=fopen(numefis, "r"))==NULL) {
printf("Eroare deschidere fisier ! \n");
exit(1);
}
cuvinte(fp);
fclose(fp);
}
Funcia cuvinte primete ca parametru un pointer la structura FILE asociat fiierului
care va fi prelucrat i care a fost deschis pentru citire. Fiierul este citit caracter cu caracter. nti
se elimin separatorii, apoi se colecteaz caracterele care formeaz un cuvnt. Primul caracter
diferit de un separator, care a determinat ieirea din ciclul while (separator(c)), poate fi
primul caracter parte din cuvnt, sau poate fi EOF dac s-a ajuns la sfrit de fiier. Dac s-a ajuns
la sfrit de cuvnt, instruciunea break determin ieirea din ciclul while deci se termin
funcia cuvinte. Altfel, caracterul c este primul caracter al cuvntului care urmeaz i se
iniializeaz l, contorul literelor cuvntului curent. Atta timp ct c este un caracter care nu este
separator i nu s-a ajuns la sfrit de fiier, se depune c n tamponul colector s. Cnd s-a ajuns la
sfritul cuvntului, se adaug la poziia curent din s i terminatorul de ir \0. Procedeul
continu atta timp ct nu s-a ajuns la sfrit de fiier.

121

6.1.6 Operaiile de intrare-ieire cu format


Asupra fiierelor se pot realiza operaii de intrare-ieire cu format utiliznd funciile
fscanf i fprintf. Aceste funcii sunt similare funciilor scanf i printf, avnd n plus un
parametru de tip pointer la fiier:
int fscanf (FILE *fis, char *format , adresa1, adresa2, ...);
int fprintf (FILE *fis, char *format, arg1, arg2, ...);
Pentru funcia fscanf, primul parametru este un pointer la un fiier care a fost deschis
pentru citire, iar pentru funcia fprintf primul parametru este un pointer la un fiier care a fost
deschis pentru scriere.
Programul 6.4: Secven care ilustreaz ieirea cu format ntr-un fiier:
#include <stdio.h>
void main(void) {
FILE * fp;
char nume_fis[15]="fis.txt";
int i=5;
char c='z';
float x=7.56;
if ((fp=fopen(nume_fis, "w"))==NULL) {
printf("Nu se poate deschide fisierul %s \n", nume_fis)
;
exit(1);
}
fprintf(fp, "%d %c %f \n", i, c,x);
fclose(fp);
}
Ca urmare a execuiei programului, se creaz fiierul cu numele fis.txt avnd
coninutul:
5 z 7.56

122

6.1.7 Intrri-ieiri de iruri de caractere


Pentru intrri i ieiri de iruri de caractere se pot utiliza funciile fgets i fputs,
similare funciilor cunoscute gets i puts.
char *fgets(char *s, int n, FILE *fis);
Funcia fgets citete maxim n-1 caractere sau pn la '\n' inclusiv, i le depune n s,
adaug la sfrit terminatorul '\0' i returneaz adresa irului. La eroare ntoarce valoarea NULL.
int fputs(char *s, FILE *fis);
Funcia fputs scrie irul n fiier, fr a scrie i caracterul '\0'. La eroare ntoarece

EOF.

6.1.8 Testul de sfrit de fiier


Pentru a testa dac parcurgerea unui fiier a ajuns la sfritul acestuia se poate utiliza
funcia feof:
int feof(FILE * fp);
Funcia returneaz o valoare nenul (adevrat) dac s-a atins sfritul de fiier.
Programul 6.5: Dintr-un fiier text se citesc rezultatele la examen ale unei grupe de
studeni. Fiierul este organizat pe linii de forma:
nume prenume nota
Se cere s se afieze cti studeni au note de 9 i 10, ci au nota ntre 6 i 8, ci au 5 i ci au
note sub 5.
Deoarece nu se cunosc de dinainte numrul de studeni din fiier, prelucrarea (citirea)
datelor se face atta timp ct nu s-a ajuns la sfritul fiierului de date de intrare, ca n programul
de mai jos.
#include <stdio.h>
#include <stdlib.h>
void main(void) {
FILE * pf;
char numefis[100];
char nume[80],pren[80];

123

int nota;
int n1=0, n2=0, n3=0, n4=0;
printf("Introd numele fisierului");
gets(numefis);
pf=fopen(numefis, "r");
if (pf==NULL) {
printf("Nu pot deschide fisierul %s \n", numefis);
exit(1);
}
while (!feof(pf)) {
fscanf(pf, "%s %s %d", nume, pren, &nota);
if ((nota==10)||(nota==9)) n1++;
else if ((nota >=6)&&(nota <=8)) n2++;
else if (nota ==5) n3++;
else n4++;
}
fclose(pf);
printf("%d %d %d %d", n1, n2, n3, n4);
}

6.2 Prelucrarea fiierelor binare


ntr-un fiier text, octeii sunt considerai coduri de caractere. Scrierea unei valori numerice
ntr-un fiier text presupune o operaie de conversie a numrului n irul de caractere care
reprezint numrul conform formatului de ieire ales. De exemplu, dac fp este un pointer la un
fiier text deschis pentru scriere, secvena urmtoare determin scrierea n fiier a textului
25640.
int i=25640;
...
fprintf(fp, "%d", i);
Valoarea ntregului i este reprezentat n fiierul text printr-un ir de caractere de lungime 5,
ocupnd 5*1 octei. Se observ c pentru scrierea valorii numerice n fiierul de tip text se
consum mai mult spaiu dect pentru reprezentarea n formatul intern n memorie (unde variabila
de tip int ocup doar 2 octei). De asemenea, pentru scrierea i citirea valorilor numerice cu
format se fac operaii de conversie ntre formatul intern de reprezentare a numerelor i iruri de

124

caractere. Rezult c fiierele de tip text nu sunt adecvate pentru a stoca pe disc baze de date
eficiente.
n fiierele organizate ca date binare, octeii nu sunt considerai ca fiind coduri de
caractere. Se consider c o nregistrare este o colecie de date structurate numite articole. La o
citire se transfer ntr-o zon tampon un numr de articole care au lungime fix. Analog, la scriere
se transfer din zona tampon un numr de articole de lungime fix.

6.2.1 Funcii pentru citirea i scrierea n fiiere binare


n C, fiierele binare pot fi prelucrate folosind funciile fread i fwrite.
unsigned fread(void *ptr, unsigned dim, unsigned nrart,
FILE *pf);
Funcia fread citete dintr-un fiier un numr de articole de aceeai dimensiune i le
stocheaz ntr-o zon de memorie alocat pentru aceasta. Parametrii funciei sunt:
ptr = pointerul spre zona tampon ce va conine articolele citite
dim = lungimea unui articol
nrart = numrul articolelor care se transfer
pf = pointer spre structura FILE care definete fiierul din care se face citirea. Acest fiier
trebuie s fi fost deschis n modul rb.
unsigned fwrite(void *ptr, unsigned dim, unsigned nrart,
FILE *pf);
Parametrii funciei fwrite au semnificaii analoage cu parametrii funciei fread.
Fiierul pf trebuie s fi fost deschis pentru scriere n mod binar, n modurile wb sau ab.
Funciile returneaz numrul articolelor transferate sau -1 n caz de eroare. Numrul de
octei transferai este dim*nrart.
Dac n fiierul binar se transfer valorile unor variabile, locaiile de memorie
corespunztoare sunt tratate ca o zon tampon de scriere:
int x=5;
double y=9.3;
...
fwrite(&x, sizeof(int), 1, fp);
fwrite(&y, sizeof(double), 1, fp);

125

Urmtorul program ilustreaz modul de manipulare al fiierelor binare.


Programul 6.6: Copierea unui fiier.
Este mai eficient s se transfere odat blocuri de dimensiuni mai mari dect un singur
caracter, ca n programul urmtor n care se definete MAX numrul maxim de octei transferai
odat.
#include <stdio.h>
#include <stdlib.h>
#define MAX 500
void main() {
int c;
char nume_sursa[80], nume_dest[80];
FILE *fs,*fd;
char buf[MAX];
int dim;
printf("Introduceti numele fisierului care se copiaza \n");
gets(nume_sursa);
printf("Introduceti numele fisierului copie \n");
gets(nume_dest);
if ((fs=fopen(nume_sursa, "rb"))==NULL) {
printf("Nu pot deschide fisierul %s \n", nume_sursa);
exit(1);
}
if ((fd=fopen(nume_dest, "wb"))==NULL) {
printf("Nu pot deschide fisierul %s \n", nume_dest);
exit(1);
}
while (!feof(fs)) {
dim=fread(buf, 1, MAX, fs);
fwrite(buf, 1, dim,
fd);
}
fclose(fs);
fclose(fd);
}

126

Se aloc o zon de memorie buf capabil s conin MAX octei. Operaia de citire din
fiierul surs este realizat de instruciunea
dim=fread(buf, 1, MAX, fs);
Aceasta transfer din fiierul fs cel mult MAX articole de 1 octet nspre zona buf. n general,
operaia de citire va transfera exact MAX octei, mai puin n ultima iteraie a ciclului cnd este
posibil ca numrul octeilor care au mai rmas de transferat s fie mai mic. Numrul exact de
octei ciii este returnat de funcia fread n variabila dim. Funcia fwrite va scrie primii dim
octei din zona buf n fiierul destinaie.

6.2.2 Poziionarea ntr-un fiier


Operaiile de citire i de scriere ntr-un fiier se execut secvenial. La fiecare apel al
funciilor de citire se citete nregistrarea curent din fiier, iar la scriere se scrie ntotdeauna la
poziia curent. Dac se dorete accesul aleator, se poate utiliza funcia de poziionare n fiier,
fseek.
int fseek(FILE *pf, long deplas, int origine);
Parametrii funciei au urmtoarele semnificaii:
pf = pointer ctre structura FILE care definete fiierul n care se face poziionarea
deplas = diferena n octei ntre poziia de referin fa de care se face deplasarea, indicat
de origine, i noua poziie care se dorete a fi obinut.
origine = un cod reprezentnd poziia de referina faa de care se face deplasarea. Aceast
poziie de referina poate fi: nceputul fiierului, codificat cu 0; poziia curent,
cofificat cu 1; sfritul fiierului, codificat cu 2.
Funcia fseek returneaz valoarea 0 dac poziionarea a fost corect i o valoare nenul
n caz contrar.
De exemplu, urmtoarea instruciune poziioneaz capul de citire/scriere la nceputul
fiierului:
fseek(pf, 0, 0);
Pentru aflarea poziiei curente n fiier se poate utiliza funcia ftell:
long ftell(FILE *fp);
Funcia returneaz o valoare reprezentnd deplasamentul, n octei, a poziiei curente a
capului de citire/scriere fa de nceputul fiierului.

127

6.3 Exerciii i probleme


1. S se scrie un program care codific un fiier text n felul urmtor: fiecare caracter este
nlocuit cu caracterul care i succede n tabela de coduri ASCII. Ultimul caracter ASCII va
deveni n urma codificrii primul caracter.
2. ntr-un fiier cod.dat este memorat o tabel de codificare, dat pe linii de forma:
caracter cod
S se preia un text din fiierul f1, s se codifice conform codului, iar textul obinut s se
scrie n fiierul f2. Dac n fiierul f1 apar caractere ale cror coduri nu au fost definite, se
va afia un mesaj de eroare.
3. S se scrie un program care citete un fiier text i l copiaz n alt fiier n care adaug i o
numerotare a liniilor n stnga fiecrei linii.
4. S se scrie un program care citete un fiier text i afieaz liniile acestuia n ordine invers
(ultima linie din fiier se afieaz prima, etc).
5. S se scrie un program care citete un fiier text i numr de cte ori apare fiecare vocal
n text.
6. S se scrie un program care citete un fiier i l afieaz pe ecran. Afiarea se va face n
pagini de cte 20 de linii. Dup fiecare pagin, programul se oprete i ateapt ca
utilizatorul s introduc o comand. Aceasta poate fi de continuare a afiarii sau de ieire
din program.
7. S se scrie un program care citete un fiier text i nlocuiete secvenele de mai multe
spaii consecutive printr-un singur spaiu.
8. S se scrie un program care citete un fiier text i numr cte cuvinte distincte conine
acesta. Se consider c separatorii ntre cuvinte sunt caracterele spaiu, tab i linia nou.
ntre dou cuvinte pot fi orici separatori.
9. S se scrie un program care elimin comentariile dintr-un program C coninut ntr-un fiier.
Se va avea n vedere c secvenele /* i */ pot apare i n interiorul unor constante iruri de
caractere, caz n care trebuie ignorate.
10. S se scrie un program care servete la generarea automat a unor cereri i formulare tip.
Sablonul cererii tip este dat ntr-un fiier text n care sunt indicate rubricile n care se
introduc informaiile personalizate. Aceste rubrici sunt indicate printr-un text ntre acolade.
La ntlnirea unei rubrici, programul va afia un mesaj prin care solicit utilizatorului
introducerea informaiei necesare. Mesajul afiat va fi Introdu <text>, unde <text>

128

este textul coninut ntre acolade. Programul va genera un fiier text n care rubricile sunt
completate cu informaiile introduse.
De exemplu, ablonul unei cereri de concediu poate fi un fiier cu urmtorul coninut:

Domnule Director,
Subsemnatul {Nume} {Prenume} va rog sa-mi aprobati
plecarea in concediu de odihna in perioada
{data start}- {data sfarsit}.
Cu respect,

La rularea programului, va avea loc urmtorul dialog cu utilizatorul:


Introduceti
Popescu
Introduceti
Ion
Introduceti
11.07.2004
Introduceti
01.08.2004

Nume:
Prenume:
data start:
data sfarsit:

Fiierul rezultat va avea urmtorul coninut:

Domnule Director,
Subsemnatul Popescu Ion va rog sa-mi aprobati
plecarea in concediu de odihna in perioada
11.07.2004 - 01.08.2004.
Cu respect,

11. S se scrie un program care adaug ntr-un fiier text personal.txt datele despre
angajaii unei firme. Datele se citesc de la tastatur i conin urmtoarele: numele,
prenumele, adresa, data nasterii, data angajrii, funcia, salariul.
12. S se scrie un program care afieaz datele pstrate n fiierul personal.txt creat n
exerciiul anterior.

129

13. Se citesc dintr-un fiier text numele i notele obinute de studeni la examen. Fiierul
conine linii de forma
nume

nota

S se calculeze media notelor din an.


14. Se citete dintr-un fiier text lista produselor care se gsesc ntr-un magazin. Fiierul e
organizat pe linii de forma
denumire_produs

pret

Se citete de la tastatur o valoare reprezentnd o sum de bani de care dispune un client.


Se cere s se afieze care e cel mai scump produs pe care l poate cumpra n limita sumei
de care dispune.
15. Se consider dou fiiere care conin numere ntregi n ordine strict cresctoare. S se
creeze un al treilea fiier care s conin toate numerele din cele dou fiiere, n ordine
strict cresctoare. Dac un numr apare n ambele fiiere de intrare el va apare o singur
dat n fiierul rezultat. Prelucrarea se va face direct de pe disc, fr a ncrca fiierele de
intrare integral n memorie.
16. S se scrie un program care creaz un fiier n care scrie valorile tuturor numerelor ntregi
ntre 1000 i 2000. Programul va fi realizat n dou variante: n prima variant lucreaz cu
un fiier text iar n a doua variant cu un fiier binar. Se vor compara cele dou fiiere.
17. S se scrie un program pentru crearea unui fiier binar avnd articole structuri cu
urmtoarele cmpuri: denumire produs, pre unitar, cantitate n stoc. Datele se introduc de
la tastatur. S se afieze coninutul fiierului.

130

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