Procesarea fișierelor binare în c

Când scrieți informații într-un fișier binar, caracterele și numerele sunt scrise ca o secvență de octeți.

Pentru a scrie date într-un fișier binar, trebuie să:







  1. descrie o variabilă de fișier de tip FAIL * cu ajutorul operatorului FILE * filename. aici numele fișierului este numele variabilei unde va fi stocat pointerul către fișier.
  2. deschideți un fișier folosind fopen
  3. scrieți informații într-un fișier utilizând fwrite
  4. închideți fișierul cu funcția fclose

Pentru a citi datele dintr-un fișier binar, trebuie să:

  1. descrie o variabila de tip FILE *
  2. deschideți un fișier folosind fopen
  3. Citiți informațiile necesare din fișier utilizând funcția Fread. monitorizând în același timp dacă se ajunge la sfârșitul dosarului.
  4. închideți fișierul cu funcția fclose

Luați în considerare funcțiile de bază necesare pentru a lucra cu fișierele binare.

Funcția fopen este utilizată pentru a deschide fișierul.

FILE * fopen (const * nume fisier, const char * mod)

Aici filename - un șir de caractere care deține numele complet al fișierului pentru a deschide, modul - un șir de caractere care specifică modul de operare cu fișierul; sunt posibile următoarele valori:

  • "Rb" - deschideți fișierul binar în modul citire;
  • "Wb" - creați un fișier binar pentru scriere; dacă există, conținutul său este șters;
  • "Ab" - creați sau deschideți un fișier binar pentru a adăuga la sfârșitul fișierului;
  • "Rb +" - deschideți fișierul binar existent în modul citire și scriere;
  • "Wb +" - deschideți fișierul binar în modul de citire și scriere, fișierul existent este șters;
  • "Ab +" - Un fișier binar este deschis sau creat pentru a repara informațiile existente și a adăuga un fișier nou la sfârșitul fișierului.

Funcția returnează valoarea NULL în variabila de fișier dacă fișierul nu se deschide cu succes. După deschiderea fișierului, al doilea octet este disponibil, pointerul fișierului este 0, valoarea căreia este deplasată de numărul de octeți citiți sau scrise ca citite sau scrise. Valoarea actuală a indicatorului de fișier este numărul de octeți din care va avea loc operația de citire sau scriere.

Funcția fclose este utilizată pentru a închide fișierul:

int fclose (fișier * numele fișierului);

Aceasta returnează 0 dacă fișierul este închis cu succes și EOF altfel.

Funcția de ștergere este utilizată pentru ștergerea fișierelor:

int remove (const char * nume fișier);

Această funcție elimină un fișier numit filenema de pe disc. Fișierul care trebuie șters trebuie închis. Funcția returnează o valoare diferită de zero dacă fișierul nu a putut fi șters.

Funcția de redenumire este utilizată pentru redenumirea fișierelor:

int redenumiți (const char * oldfilename, const char * newfilename);

Primul parametru este vechiul nume de fișier, al doilea este cel nou. Returnează 0 dacă programul termină cu succes.

Citirea dintr-un fișier binar se face folosind funcția Fread:

fread (void * ptr, mărime, n, FILE * numele fișierului);

Funcția freadă citește elementele de mărime din fișierul filename în ptr n array. Funcția returnează numărul de elemente citite. După citirea din fișier, indicatorul său este deplasat cu octeți de dimensiune n *.

Fișierul binar este scris utilizând funcția fwrite:

fwrite (const void * ptr, mărime, n, FILE * numele fișierului);

Funcția fwrite scrie la fișier numele fișierului din matricea ptr n elemente de mărimea dimensiunii. Funcția returnează numărul elementelor scrise. După scrierea informațiilor în fișier, pointerul este mutat cu octeți de dimensiune n *.

Pentru a controla sfârșitul fișierului, există o funcție feof:

Aceasta returnează o valoare diferită de zero dacă se ajunge la sfârșitul fișierului.

Pentru o asimilare mai precisă a materialului, propun să analizăm câteva probleme standard.

Crearea unui fișier binar D: \\ joc \\ noobs.dat și scrie în ea un număr întreg n și n numere reale.

#include "stdafx.h"
#include
folosind namespace std;
int principal # 40; # 41;
# 123;
setlocale # 40; LC_ALL, "RUS" # 41; ;
int n, i;
dublu a;
FILE * f; // descrie variabila fișierului






// creați un fișier binar în modul de scriere
f = fopen # 40; "D: \\ joc \\ noobs.dat". "Wb" # 41; ;
// introduceți numărul n
cout <<"n=" ; cin>> n;
fwrite # 40; n, dimensiune # 40; int # 41;. 1. f # 41; ;
// introduceți n numere reale
pentru # 40; i = 0; eu # 123;
// introduceți următorul număr real
cout <<"a=" ;
cin >> a;
// scrieți numărul real într-un fișier binar
fwrite # 40; a, dimensiune # 40; dublu # 41;. 1. f # 41; ;
# 125;
// închideți fișierul
fclose # 40; f # 41; ;
sistem # 40; „Pauză“ # 41; ;
retur 0;
# 125;

Afișați conținutul fișierului binar creat în sarcina anterioară: \\ game \\ noobs.dat

#include "stdafx.h"
#include
folosind namespace std;
int principal # 40; # 41;
# 123;
setlocale # 40; LC_ALL, "RUS" # 41; ;
int n, i;
dublu * a;
FILE * f; // descrie variabila fișierului
// deschideți fișierul binar existent în modul citire
f = fopen # 40; "D: \\ joc \\ noobs.dat". "Rb" # 41; ;
// citiți de la un fișier un întreg la variabila n
fread # 40; n, dimensiune # 40; int # 41;. 1. f # 41; ;
// ieșire n pe ecran
cout <<"n=" < // alocați memoria pentru o serie de numere n
a = dublu nou # 91; n # 93; ;
// citi n numere reale de la fișier la matrice a
fread # 40; a, dimensiune # 40; dublu # 41;. n, f # 41; ;
// scoateți matricea pe ecran
pentru # 40; i = 0; eu cout < cout < // închideți fișierul
fclose # 40; f # 41; ;
sistem # 40; „Pauză“ # 41; ;
retur 0;
# 125;

Un fișier binar este o structură de date secvențială, după deschiderea fișierului, primul octet stocat în acesta este disponibil. Puteți scrie sau citi consecutiv date dintr-un fișier. Să presupunem că trebuie să numărăm numărul al cincisprezecelea și apoi primul. Cu ajutorul accesului serial, acest lucru se poate face în felul următor:

int n, i;
dublu a;
FILE * f;
f = fopen # 40; "D: \\ joc \\ noobs.dat". "Rb" # 41; ;
pentru # 40; i = 0; eu <15 ; i ++ )
fread # 40; a, dimensiune # 40; dublu # 41;. 1. f # 41; ;
fclose # 40; f # 41; ;
f = fopen # 40; "D: \\ joc \\ noobs.dat". "Rb" # 41; ;
fread # 40; a, dimensiune # 40; dublu # 41;. 1. f # 41; ;
fclose # 40; f # 41; ;

După cum puteți vedea, citirea acestor numere dintr-un fișier și apoi redeschiderea unui fișier nu este cel mai convenabil mod. Este mult mai convenabil să utilizați funcția fseek pentru a muta pointerul fișierului la octetul specificat.

int fseek (fișier * nume fișier, lung int offset, int origine);

Funcția stabilește indicatorul de poziție al fișierului curent F în funcție de valorile de origine și de offset. Parametrul de offset este egal cu numărul de octeți la care este mutat indicatorul de fișier în raport cu originea specificată de parametrul de origine. Valoarea pentru parametrul de origine trebuie să fie una dintre următoarele valori de offset compensate. definite în antetul stdio.h:

  • SEEK_SET - de la începutul fișierului;
  • SEEK_CUR - din poziția curentă;
  • SEEK_END - de la sfârșitul fișierului.

Funcția returnează o valoare zero la executarea cu succes a operației, nenulo - dacă există o eroare în execuția offsetului

Funcția fseek implementează, de fapt, acces direct la orice valoare din fișier. Este necesar doar să cunoașteți locația (numărul octetului) a valorii din fișier. Luați în considerare utilizarea accesului direct în fișiere binare pe exemplul de rezolvare a problemei următoare.

În fișierul binar timpuriu creat D: \\ game \\ noobs.dat. swap cel mai mare și mai mic dintre numerele reale.

Algoritmul de rezolvare a problemei constă în următoarele etape:

  1. citirea reală de la fișier la matrice a.
  2. căutarea în matrice a valorilor maxime (max) și minime (min) și a numerelor acestora (imax. imin).
  3. Mutați cursorul fișierului la valoarea maximă și înregistrați min.
  4. Mutați cursorul fișierului la valoarea minimă și scrieți max.

#include "stdafx.h"
#include
folosind namespace std;
int principal # 40; # 41;
# 123;
setlocale # 40; LC_ALL, "RUS" # 41; ;
int n, i, imax, imin;
dublu * a, max, min;
FILE * f;
// deschideți fișierul în modul citire și scriere
f = fopen # 40; "D: \\ joc \\ noobs.dat". "rb +" # 41; ;
// citiți din fișier la variabila n numărul
// numere reale din fișier
fread # 40; n, dimensiune # 40; int # 41;. 1. f # 41; ;
cout <<"n=" < // alocați memorie pentru stocarea numerelor reale,
// care va fi stocat în matrice a
a = dublu nou # 91; n # 93; ;
// citiți din fișier în matrice un număr real
fread # 40; a, dimensiune # 40; dublu # 41;. n, f # 41; ;
// căutați elementele maxime și minime
// în matricea a și indexurile acestora
pentru # 40; imax = imin = 0. max = min = a # 91; 0 # 93;. i = 1; eu # 123;
dacă # 40; o # 91; eu # 93;> max # 41;
# 123;
max = a # 91; eu # 93; ;
imax = i;
# 125;
dacă # 40; o # 91; eu # 93; # 123;
min = a # 91; eu # 93; ;
imin = i;
# 125;
# 125;
// Mutați cursorul la elementul maxim
fseek # 40; f, dimensiune # 40; int # 41; + imax * sizeof # 40; dublu # 41;. SEEK_SET # 41; ;
// scrie min în loc de elementul maxim al fișierului
fwrite # 40; min, dimensiune # 40; dublu # 41;. 1. f # 41; ;
// mutați cursorul la elementul minim
fseek # 40; f, dimensiune # 40; int # 41; + imin * sizeof # 40; dublu # 41;. SEEK_SET # 41; ;
// scrie max în loc de elementul minim al fișierului
fwrite # 40; max, sizeof # 40; dublu # 41;. 1. f # 41; ;
// închiderea fișierului
fclose # 40; f # 41; ;
// eliberați memoria
șterge # 91; # 93; o;
sistem # 40; „Pauză“ # 41; ;
retur 0;
# 125;

Deci, am luat în considerare principiile de bază ale colaborării cu fișiere în C ++. În următoarele lecții se vor întâlni, așa că învățați-le cât mai bine posibil.







Trimiteți-le prietenilor: