Documente Academic
Documente Profesional
Documente Cultură
SISTEMUL DE INTRĂRI/IEŞIRI
in limbajul C/C++
CUPRINS
1. Flux, fişier
2. Operaţii pe fişiere
2
1. FLUX, FIŞIER
In limbajul C, sistemul I/E nu este o parte a limbajului, ci
este adăugat printr-un set de funcţii din biblioteca standard
(stdio.h, cstdio)
Transferurile cu dispozitivele periferice (DP) se fac prin
intermediul unor dispozitive logice identice numite stream
(flux) şi prin intermediul SO:
acest lucru permite ca detaliile funcţionale ale DP să poată fi
ignorate la nivelul programului
Cu ajutorul fluxurilor:
programatorul utilizează aceleaşi funcţii indiferent de DP cu
care lucrează
sunt ascunse detaliile fizice de funcţionare ale DP
3
FLUX
Tipuri de fluxuri :
flux text:
transferă secvenţe de caractere organizate în linii
5
FLUX
6
FLUX
8
typedef struct {
int level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
int bsize; /* Buffer size */
unsigned char _FAR *buffer; /* Data transfer buffer */
unsigned char _FAR *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object
Borland 9
typedef struct
{
char* _ptr;
int _cnt;
char* _base;
int _flags;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
}FILE;
Visual Studio
10
FLUX
unde câmpul flags conţine următoarele informaţii:
_F_RDWR Read and write
_F_READ Read-only file
_F_WRIT Write-only file
_F_BUF Malloc'ed buffer data
_F_LBUF Line-buffered file
_F_ERR Error indicator
_F_EOF EOF indicator
_F_BIN Binary file indicator
_F_IN Data is incoming
_F_OUT Data is outgoing
_F_TERM File is a terminal
11
FLUX
Streamurile standard au tipul pointer la structura FILE
(FILE *) şi pot fi utilizate cu orice funcţie care lucrează
cu fişiere:
programatorul poate utiliza aceste fluxuri, dar nu le poate
modifica
la nivel superior:
se folosesc funcţii ce au la bază structura FILE definită
în stdio.h 12
2. OPERAŢII PE FIŞIERE
Deschiderea unui fişier
15
OPERAŢII PE FIŞIERE
Se recomandă testarea pointerului returnat de funcţie înainte
de a fi folosit în alte funcţii pentru fişiere
La deschiderea unui fişier disc se iniţializează o variabilă
index care indică poziţia curentă în fişier:
dacă modul de acces este în citire sau scriere, iniţializarea se
face cu 0
dacă modul de acces este în adăugare, inţializarea se face cu
numărul de octeţi din fişier
FILE *fp;
char nume_fis[ ] = "Readme.txt";
17
MICROSOFT VC++1Y
errno_t fopen_s( FILE** pFile, const char *filename, const
char *mode );
Parametri:
pFile – pointer la pointerul de tip FILE care primeşte
pointerul la fişierul deschis.
filename –numele fișierului.
Valoarea returnată:
zero pentru succes; cod de eroare la eşec. Vedeți errno,
_doserrno, _sys_errlist, și _sys_nerr pentru mai multe
informaţii despre aceste coduri de eroare 18
fopen_s() suportă fluxuri Unicode. Pentru a deschide
un fişier Unicode nou sau existent, se trimite un flag
ccs care specifică codarea dorită către fopen_s():
fopen_s(&fp, "newfile.txt", "rw, ccs= encoding ");
19
#include <stdio.h>
int main(void) {
FILE *stream;
errno_t err;
err = fopen_s(&stream, "d:/test", "w+");
if(err == 0) {
printf("S-a deschis fisierul \'test\' \n");
}
else {
printf("Fisierul \'test\' nu s-a deschis\n");
}
}
20
OPERAŢII PE FIŞIERE
Observaţii:
In şirul de caractere ce dă numele şi calea către fişier,
caracterul '\' se reprezintă prin secvenţa de evitare '\\‘
sub SO Windows. Se poate folosi ‘/’ sub orice SO.
SO nu face distincţie între literele mari şi cele mici
Nu pot fi deschise simultan oricâte fişiere:
numărul maxim de fişiere este precizat în variabile de stare
ale SO
21
OPERAŢII PE FIŞIERE
22
OPERAŢII PE FIŞIERE
Observaţii:
Bufferele cu care lucrează funcţiile pentru fişiere au
aceeaşi dimensiune cu cantitatea de informaţii ce
poate fi scrisă fizic pe disc într-o singură operaţie
Scrierea are loc efectiv doar când bufferul este plin
Dacă bufferul nu este plin, apelul funcţiei fclose( )
determină scrierea conţinutului bufferului pe disc
La închiderea unui fişier se eliberează şi bufferul
asociat fişierului
La terminarea programului prin apelul funcţiei exit( )
se închid toate fişierele deschise
23
EXEMPLU VC++1Y
// Deschide 2 fisiere . Foloseste fclose() pentru a inchide unul si //_fcloseall()
pentru a inchide tot ce mai ramane deschis
#include <stdio.h>
#include <conio.h>
FILE *stream, *stream2;
int main( void ){
errno_t err;
// deschidere pentru citire
err = fopen_s( &stream, "D:/CPP/Source.cpp", "r" );
if( err == 0 )
printf("Fisierul 'Source.cpp' a fost deschis\n" );
else
printf("Fisierul 'Source.cpp' nu a fost deschis\n" );
24
// Deschidere pentru scriere
err = fopen_s( &stream2, "D:/CPP/data2.dat", "w+" );
if( err == 0 )
printf( " Fisierul 'data2.dat' a fost deschis \n" );
else
printf( " Fisierul 'data2.dat' nu a fost deschis\n" );
// inchide fluxul
if( stream ) {
err = fclose( stream );
if ( err == 0 )
printf( " Fisierul 'Source.cpp' a fost inchis\n" );
else
printf( "Fisierul 'Source.cpp' nu a fost inchis\n" );
}
// se inchid celelalte fisiere
int numclosed = _fcloseall( );
printf("Numarul de fisiere inchise de _fcloseall: %u\n",
numclosed );
}
25
OPERAŢII PE FIŞIERE
Prelucrări la nivel de caracter (cuvânt)
int fputc(int c, FILE *stream); // functie
int putc(int c, FILE *fp); // posibil implementat ca macro
Acţiuni:
se scrie caracterul c în fişierul asociat lui fp
se returnează valoarea scrisă sau EOF în caz de eşec
Acţiuni:
citeşte un caracter din fişierul specificat prin parametrul fp
returnează codul ASCII al caracterului sau EOF în caz de eşec
După citirea unui caracter se avansează poziţia curentă
în fişier
In stdio.h se defineşte macroul getchar pentru citirea
caracterelor de la intrarea standard (stdin):
#define getchar( ) getc(stdin)
La nivel de cuvânt (2-4 octeţi) există următoarele funcţii
(pentru lucrul cu intregi, fisiere binare):
int putw(int i, FILE *fp);
27
int getw(FILE *fp);
!!! _putw(), respectiv _getw() in VS 2019.
OPERAŢII PE FIŞIERE
/*copiaza un fisier caracter cu caracter intr-un fisier destinatie */
#include <stdio.h>
int main(void){
FILE *fps, *fpd;
char c;
char fiss[ ] = "D:/CPP/Source.cpp";
char fisd[ ] = "D:\\CPP\\Fis2.txt";
errno_t err;
if((err = fopen_s(&fps, fiss, "rb") != 0)) {
puts("Eroare la deschiderea fisierului sursa !");
return 1; }
if((err = fopen_s(&fpd,fisd, "wb") != 0)) {
puts("Eroare la deschiderea fisierului destinatie!");
return 1; }
while((c = getc(fps)) != EOF) putc(c, fpd);
fclose(fpd);
fclose(fps);
return 0; }
28
/*afiseaza caracter cu caracter un fisier cu numele citit din linia de c-da */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[ ]){
FILE *fp;
errno_t err;
char c;
if(argc == 2) {
err = fopen_s(&fp, argv[1], "r");
if((err != 0)){
printf("\nEroare la deschiderea fisierului : %s\n",
argv[1]);
exit(1);
}
while((c = fgetc(fp)) != EOF) fputc(c, stdout);
fclose(fp);
} 29
else printf("\nEnd program");
}
OPERAŢII PE FIŞIERE
Intrări/ieşiri de şiruri de caractere
int fputs(const char *str, FILE *fp);
Acţiuni:
scrie şirul de caractere specificat de str în fişierul specificat
de fp
returnează codul ASCII al ultimului caracter scris în fişier sau
valoarea EOF în caz de eşec
30
OPERAŢII PE FIŞIERE
Intrări/ieşiri de şiruri de caractere
char *fgets(char *str, int n, FILE *fp);
Acţiuni:
citeşte cel mult (n-1) caractere din fişierul precizat de fp în şirul
specificat de pointerul str
returnează un pointer la şirul în care se depun caracterele sau
valoarea NULL în caz de eroare
şirul este completat cu caracterul '\0'
#define DIML 81
int main(void){
FILE *fps, *fpd;
errno_t err;
char buf[DIML], *p;
char fiss[ ] = "D:/CPP/Source.cpp", fisd[ ] =
"D:/CPP/fis3.txt";
// deschidere fisier sursa
if((err = fopen_s(&fps, fiss, "r") != 0)){
puts("Eroare la deschiderea fisierului sursa !");
exit(1); 32
}
OPERAŢII PE FIŞIERE
// deschidere fisier destinatie
if((err = fopen_s(&fpd, fisd, "w") != 0)){
puts("Eroare la deschiderea fisierului destinatie!");
exit(1);
}
//citire date din fisierul sursa
while((p = fgets(buf, DIML, fps)) != NULL)
fputs(buf, fpd); // scriere date destinatie
// inchidere fisiere
fclose(fpd);
fclose(fps);
puts("Copiere terminata");
}
33
OPERAŢII PE FIŞIERE
Intrări/ieşiri cu format
Acţiuni:
converteşte datele din format intern în format extern
(ASCII) şi le scrie în fişierul indicat de pointerul fp
returnează numărul caracterelor scrise în fişier sau
o valoare negativă (-1) în caz de eroare
34
OPERAŢII PE FIŞIERE
FILE *fp;
int i = 100;
char c = 'C';
...
fp = fopen("Test.txt", "w+");
fprintf(fp, "%d %c", i, c);
...
fclose(fp);
35
FISIERE IN VISUAL STUDIO C++1Y -EXEMPLE
#include <stdio.h>
#include <stdlib.h>
//fopen_s - VC++13
int main(void){
FILE *fps, *fpd;
char c;
char fis_s[] = "fis1.txt", fis_d[] = "fis2.txt";
// fisiere din directorul curent
errno_t err;
// deschidere fisier sursa
err=fopen_s(&fps, fis_s, "w");
36
if(err!=0) {
puts("Eroare la creare fisierului sursa !");
exit(1); }
fprintf(fps,"ttt");
fclose(fps);
err=fopen_s(&fps, fis_s, "r");
if(err!=0){
// fis1.txt va fi in directorul unde se afla
fisierul sursa *.cpp
puts("Eroare la deschiderea fisierului sursa !");
exit(1);
}
// deschidere fisier destinatie
err=fopen_s(&fpd, fis_d, "w");
37
if(err!=0) {
puts("Eroare la deschiderea fisierului destinatie!");
exit(1);
}
while((c = getc(fps)) != EOF) // citire caractere din fisierul sursa
putc(c, fpd); // scriere caractere in fisierul destinatie
// inchidere fisiere
fclose(fps);
fclose(fpd);
puts("Copiere terminata in fis2.txt");
}
38
OPERAŢII PE FIŞIERE
Intrări/ieşiri cu format
Acţiuni:
citeşte caractere din fişierul indicat de pointerul fp
şi le converteşte din formatul extern în formatul
intern
returnează numărul câmpurilor citite corect sau
EOF în caz de eroare sau dacă s-a ajuns la
sfârşitul fişierului
}
err = fopen_s(&pFile, "myfile.txt","r");
if(err==0){
fscanf_s(pFile, "%f", &f);
fscanf_s(pFile, "%s", str, _countof(str));
fclose(pFile);
printf("S-a citit din fisier: %f and %s \n", f, str);
}
else {
puts("\nEroare la deschiderea fisierului");
exit(1);
}
}
42
OPERAŢII PE FIŞIERE
Operaţii de formatare în memorie (in şiruri de caractere)
Acţiuni:
valorile rezultate în urma conversiei din formatul
intern în formatul extern sunt scrise în şirul de
caractere specificat de parametrul buf
char buffer[80];
...
sprintf(buffer, "Pi = %f\n", M_PI);
puts(buffer);
44
OPERAŢII PE FIŞIERE
Acţiuni:
datele în format ASCII din şirul de caractere
precizat de pointerul buf sunt preluate, convertite şi
înscrise la adresele specificate în lista de parametri
45
#include<stdio.h>
int main(){
char str[200];
char nume[20], prf[20];
int v;
float g;
}
OPERAŢII PE FIŞIERE
Citirea şi scrierea datelor binare
In cazul fişierelor binare nu se interpretează conţinutul
informaţiei
O înregistrare într-un fişier binar este o colecţie de
articole:
articolul este o dată predefinită sau definită de utilizator (de
exemplu octeţi, cuvinte, structuri,...)
48
OPERAŢII PE FIŞIERE
int main(void){
errno_t err;
FILE *fp;
char nume_fis[ ] = "D:/CPP/Date_cal.dat";
int n;
struct datac str;
fclose(fp);
} 52
OPERAŢII PE FIŞIERE
Funcţia feof( )
int feof(FILE *fp);
53
OPERAŢII PE FIŞIERE
Golirea zonei tampon
int fflush(FILE *fp);
Descriere:
în cazul unui fişier deschis pentru scriere se forţează scrierea pe
disc (golirea sau vidarea bufferului), chiar dacă zona tampon nu
este plină
În unele implementări (unele compilatoare), în cazul unui fişier
deschis pentru citire se şterge zona tampon asociată şi se pierd
datele
55
OPERAŢII PE FIŞIERE
56
OPERAŢII PE FIŞIERE
current_pos = ftell(fp);
fseek(fp, 0L, SEEK_END);
length = ftell(fp);
fseek(fp, current_pos, SEEK_SET);
return(length);
}
59
OPERAŢII PE FIŞIERE
Alte funcţii
int ferror(FILE *fp);
Returnează o valoare nenulă dacă în fişierul indicat
de pointerul fp a apărut o eroare sau valoarea 0 în
caz contrar
informaţiile se referă la ultimul acces la fişier