Scrierea și citirea tipurilor de date personalizate în fișiere binare. Postări

Fișiere. Mai mult, din punct de vedere al implementării tehnice la nivel hardware, fișiere text sunt un caz special de fișiere binare și astfel, în sensul larg al cuvântului, orice fișier se potrivește definiției „fișierului binar”.

În general, acest termen reprezintă o măsură a atitudinii consumatorului fișier binarși fișierul în sine. Dacă consumatorul cunoaște structura și regulile prin care este capabil să se transforme acest dosar la un nivel superior, atunci nu este binar pentru el. De exemplu, fișierele executabile sunt binare pentru utilizatorul computerului, dar nu sunt binare pentru sistemul de operare. [ ]

Vizualizarea

Pentru reprezentare vizuală fișier binar este rupt în bucăți de dimensiuni egale, reprezentate ca numere, scrise de obicei în hexazecimal, uneori în octal, binar sau zecimal. Dimensiunea chunk-ului indicată poate fi egală cu un octet, precum și cu doi sau patru (în cazul împărțirii în bucăți de mai mulți octeți, se folosește ordinea octetilor adoptată pe platforma utilizată). Dependența intervalului de numere reprezentate de dimensiunea piesei este prezentată în tabel:

octeți număr de biți hexazecimal octal zecimal
nesemnat
zecimal
iconic
1 8 00

FF
000

377
0

255
-128

127
2 16 0000

FFFF
000000

177777
0

65535
-32768

32767
4 32 00000000

FFFFFFFF
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Adesea, pe lângă valorile numerice ale octeților, sunt afișate și caractere ale paginii de cod, cum ar fi ASCII. Următorul exemplu arată așa-numitul. groapa clasică(reprezentare hexazecimală octet-cu-octet de 16 octeți pe linie, cu caractere ASCII imprimabile în partea dreaptă) a începutului fișierului PNG logo-ul Wikipedia:

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |.....gAMA.....OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000a0 27 27 27 1a 1a 1a 38 38 38 2a 2a 2a 08 08 08 20 |"""...888**... | 000000b0 20 20 17 17 17 2e 8 8bb | . ............|

Instrumente

Pentru vizualizare

  • depanare (pe Microsoft Windows, parțial)
  • hexdump (pe FreeBSD, GNU/Linux, etc.)

Pentru editare

  • Editor HEX
    • beye (pentru toate sistemele de operare, software gratuit)
    • hiew (pentru DOS, Microsoft Windows, Windows NT)
    • WinHex (pentru Windows)

Fișiere. Mai mult, din punct de vedere al implementării tehnice la nivel hardware, fișierele text reprezintă un caz special de fișiere binare și astfel, în sensul larg al cuvântului, orice fișier se potrivește definiției de „fișier binar”.

Fișierele binare sunt adesea folosite pentru a face referire la fișiere executabile și date comprimate, dar este incorect să limitați acest concept în acest fel.

Vizualizarea

Pentru a reprezenta vizual un fișier binar, acesta este împărțit în bucăți de dimensiuni egale, reprezentate ca numere, scrise de obicei în hexazecimal, uneori în octal, binar sau zecimal. Dimensiunea chunk-ului indicată poate fi egală cu un octet, precum și cu doi sau patru (în cazul împărțirii în bucăți de mai mulți octeți, se folosește ordinea octetilor adoptată pe platforma utilizată). Dependența intervalului de numere reprezentate de dimensiunea piesei este prezentată în tabel:

octeți număr de biți hexazecimal octal zecimal
nesemnat
zecimal
iconic
1 8 00

FF
000

377
0

255
-128

127
2 16 0000

FFFF
000000

177777
0

65535
-32768

32767
4 32 00000000

FFFFFFFF
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Adesea, pe lângă valorile numerice ale octeților, sunt afișate și caracterele paginii de cod, de exemplu, caractere ASCII tipărite în partea dreaptă) la începutul fișierului PNG logo-ul Wikipedia:

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |.....gAMA.....OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000A0 27 27 27 1A 1A 1A 38 38 38 2A 2A 2A 08 08 08 20 | "" "" ... 888 *** ... | 000000B0 20 20 17 17 17 2E 2E 2E 13 13 13 BB BB BB 88 88 | ...............|

Instrumente

Pentru vizualizare

  • depanare (pe Microsoft Windows, parțial)
  • hexdump (în GNU/Linux, etc.)

Pentru editare

Literatură

  • Webster's New World Dictionary of Computer Terms, al 4-lea. Ed, Prentice Hall, NY, 1992. ISBN 0-671-84651-5
  • Leontyev B.K. Formate de fișiere Microsoft Windows XP: Director, M.: JSC „New Publishing House”, 2005. ISBN 5-9643-0059-6.

Fundația Wikimedia.

2010.

    Vedeți ce este un „fișier binar” în alte dicționare: Substantiv, m., folosit. comparaţie adesea Morfologie: (nu) ce? dosar, nu? dosar, (vezi) ce? dosar, ce? dosar, despre ce? despre dosar; pl. Ce? fișiere, (nu) ce? fisiere, ce? fișiere, (văd) ce? fisiere, ce? fișiere, despre ce? despre fișiere 1. Un fișier este o matrice... ...

    Fișier binar în sensul cel mai larg: o secvență de octeți arbitrari. Numele se datorează faptului că octeții constau din biți, adică cifre binare. În sensul restrâns al cuvântului, fișierele binare sunt opuse fișierelor text.... ... Wikipedia

    Fișier binar în sensul cel mai larg: o secvență de octeți arbitrari. Numele se datorează faptului că octeții constau din biți, adică cifre binare. În sensul restrâns al cuvântului, fișierele binare sunt opuse... ... Wikipedia

    fișier de configurare- Un fișier binar sau text care conține informații care determină comportamentul unei aplicații, computer sau dispozitiv de rețea. Subiecte de rețea de computere EN fișier de configurare...

    Ghidul tehnic al traducătorului

    Acest termen are alte semnificații, vezi IPA (sensuri). Format .IPA pentru fișiere de arhivă ale aplicațiilor Apple pentru iPhone, iPod Touch și iPad. Fișierele cu această extensie sunt stocate în App Store și descărcate folosind iTunes pentru... ... Wikipedia

    Acest articol sau secțiune necesită revizuire. Nu există module, POO sau alte tendințe noi în Pascal. Descrierile extensiilor ar trebui să fie prezente numai în articolele despre ... Wikipedia corespunzătoare

    Pascal Semantică: procedurală Tip de execuție: compilator Apărut în: 1970 Autor(i): Niklaus Wirth Pascal este un limbaj de programare de nivel înalt de uz general. Unul dintre cele mai cunoscute limbaje de programare, pe scară largă... ... Wikipedia

    Nume Gopher: Port/ID Gopher: 70/TCP Specificație: RFC 1436 Implementări principale (clienți): Mozilla Firefox, Microsoft Windows: IE 5.x, IE 6 (limitat la MS) Protocolul de rețea Gopher pentru preluare distribuită și transfer de documente, anterior folosit pe scară largă... Wikipedia

    Nume: Gopher Port/ID: 70/TCP Specificație: RFC 1436 Principalele implementări (clienți): Mozilla Firefox, Microsoft Windows: Internet Explorer 5.x, Internet Explorer 6 (limitat la MS) Protocol de rețea Gopher pentru căutare și transmisie distribuită.. . ... Wikipedia

- / * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Notă: Deoarece extensia numelui de fișier poate fi orice, lista furnizată nu este completă... Wikipedia

Vom încerca să explicăm totul în cei mai simpli termeni posibil, pentru că astfel de informații sunt utile pentru fiecare utilizator, chiar și pentru cel mai neexperimentat, deoarece este direct legată de elementele de bază ale securității computerului.

Puțină teorie

Fișierul text conține caractere ASCII (abrevierea înseamnă American Standard Code for Information Interchange, ceva de genul „American Standard Code for Information Interchange”).

De fapt, ASCII este un tabel în care fiecărei litere, număr, semn de punctuație și diverși „câini” cu „fulgi de zăpadă” (în sensul de @ și *) sunt alocați câte un octet. Adică opt zerouri și unu (biți). În plus, desigur, controlează personaje precum noua linie.

Un program pentru deschiderea fișierelor cu caractere ASCII convertește octeții în litere, numere și alte caractere imprimabile pe afișaj. Desigur, software-ul trebuie să înțeleagă acea parte a tabelului care corespunde limbii ruse, dar aceasta este deja o chestiune de codificare.

Într-un fișier binar, zerourile și unurile sunt aranjate în secvențe care nu sunt neapărat necesare pentru afișarea textelor (deși există unele, de exemplu, *doc). De ce, întrebi. Răspunsul este simplu: pentru orice altceva. Programe, filme, muzică, imagini - fiecare format are propriile sale principii structurale de organizare a datelor.

Cuvântul „binar” în sine înseamnă „format din două componente”, „dublu”. Într-adevăr, este posibil să definiți clar doar două componente - zero și unu, biți, „cărămizi” din care este compus fișierul. Semnificația tuturor celorlalte poate apărea doar în timpul pornirii (deschidere, redare).

Partea greșită a lumii digitale

Puteți căuta în interiorul fișierului binar folosind un program special - un editor HEX. (Din cuvântul Hexazecimal, care denotă sistemul numeric hexazecimal.) Un astfel de software arată octeții sub forma denumirilor lor HEX, care sunt de fapt localizați și sub forma unui tabel (matrice).

De exemplu, octeții unei imagini în format JPEG, o imagine obișnuită sau o fotografie, vor fi afișați în fereastra editorului ca FF D8 FF 00 04 3A 29 și așa mai departe.

Un specialist va înțelege că secvența de octeți FF D8 de la început indică faptul că acesta este un JPEG. Dar toate acestea nu sunt atât de interesante pentru nespecialiști.

De asemenea, puteți deschide un fișier text într-un editor HEX pentru a vedea ce octeți corespund unor anumite litere (caractere ASCII). Dar doar din curiozitate, tot nu are rost.

Dar fișierele binare sunt uneori vizualizate în format hexazecimal pentru scopuri destul de semnificative și specifice. De exemplu, specialiștii din laboratorul antivirus caută cod rău intenționat adăugat celui principal în acest fel. Apropo, să trecem la problemele de securitate.

Ce poate dăuna

Un fișier text nu poate conține altceva decât caractere ASCII. Cu toate acestea, programele nu sunt doar binare, ci și constau din simbolurile de mai sus. Mă refer la scenarii, desigur.

Cu alte cuvinte, fișierul *txt nu este infectat în principiu și nu reprezintă o amenințare. Și dacă există un script în interiorul unui fișier text, atunci poate cauza multe probleme.

De exemplu, fișierul *bat conține codul diferitelor comenzi și este lansat prin dublu clic, ca un program obișnuit. Acele comenzi sunt scrise cu caractere ASCII, dar sistemul de operare știe să le interpreteze - transformă-le în zerouri și în unele tipice pentru programe.

Dar, desigur, nu dați clic pe fișiere bat necunoscute, nu? Asta e bine.

Publicații anterioare:

Ultima modificare: 06-11-2012 14:45:16

Etichete materiale: ,

Exemplele pe care le-am luat în considerare până acum au demonstrat intrarea/ieșirea formatată a informațiilor în fișiere. Este recomandabil să utilizați fișiere formatate de intrare/ieșire a numerelor numai atunci când acestea sunt mici ca dimensiune și cantitate, precum și atunci când este necesar să se ofere posibilitatea de a vizualiza fișiere folosind mijloace non-programatice. Altfel, desigur, este mult mai eficient să folosiți I/O binare, care stochează numere în același mod ca în OP-ul computerului, mai degrabă decât ca șiruri de caractere. Permiteți-mi să vă reamintesc că o valoare întreagă (int) sau reală (float) ocupă 4 octeți în memorie, o valoare dublă ia 8 octeți, iar o valoare char ia 1 octet. De exemplu, numărul 12345 dintr-un fișier text (formatat) are 5 octeți, iar într-un fișier binar are nevoie de 4 octeți.

Fișiere binare, adică fișierele în care informațiile sunt stocate într-o formă de reprezentare internă sunt utilizate pentru utilizare ulterioară de către software nu pot fi vizualizate non-software; Avantajul fișierelor binare este că, în primul rând, la citire/scriere, nu se pierde timpul la conversia datelor din forma simbolică de reprezentare în cea internă și invers, iar în al doilea rând, nu există pierderi de precizie a numerelor reale. Atât în ​​cazul intrării/ieșirii formatate, cât și în cazul intrării/ieșirii binare, pentru a procesa „corect” informații dintr-un fișier, trebuie să știți ce tipuri de date, cum și în ce secvență sunt scrise în binar fișier, mai ales că vizualizarea unui fișier binar folosind un editor de text nu va face nimic.

Să luăm în considerare un exemplu care demonstrează scrierea elementelor întregi ale unui tablou dinamic într-un fișier binar și citirea lor din acest fișier.

#include

#include

#include

folosind namespace std;

cout<< "Vvedite kol-vo elementov celochisl. massiva: "; cin >> N;

int *mas = new int [N];

pentru(i=0; i

cout<< " Vvedite " << i << "-i element: "; cin >> mas[i];

cout<< "\nIdet zapis dannyh v fail..." << endl;

ofstream fout("c:\\os\\bin.dat", ios::binary);//creat Ieșire flux binar

if(!fout) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

fout.write(reinterpret_cast (mas), N*sizeof(int));// scrieți matrice în fișier

fout.close();//închiderea fluxului

cout<< "Dannye uspeshno zapisany!" << endl;

pentru(i=0; i

ifstream fin("c:\\os\\bin.dat", ios::binary); //creez un thread pentru a citi fișierul

if(!fin) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

cout<< "Fail sodergit:" << endl;

fin.read(reinterpret_cast (mas), N*sizeof(int));//citește matricea din fișier

pentru(i=0; i

getch(); întoarce 0;

În acest program, o atenție deosebită trebuie acordată utilizării funcțiilor write() (metoda clasei ofstream) și read() (metoda clasei ifstream). Aceste funcții gândesc datele în termeni de octeți și sunt concepute pentru a transfera un anumit număr de octeți dintr-un buffer de date într-un fișier și înapoi. Parametrii acestor funcții sunt adresa tampon și lungimea acesteia în octeți.

Funcția write() este concepută pentru a scrie într-un fișier numărul de octeți specificat în al doilea parametru dintre cei specificați în primul parametru adrese tampon de date, iar funcția read() este concepută pentru a citi date dintr-un fișier. Trebuie remarcat aici că aceste funcții funcționează numai cu un buffer de date de tip char. În acest sens, în acest program am folosit operatorul reinterpret_cast<> care convertește tamponul nostru de date de tip int (mas) într-un tampon de tip char.

Este important de reținut că turnarea folosind operatorul reinterpret_cast necesar numai în cazurile în care primul parametru al funcţiilor scrie() Şi citire() nu este o matrice de caractere (la urma urmei, un caracter de tip char durează doar 1 octet).În plus, dacă trebuie să scrieți sau să citiți nu o matrice, ci variabile individuale, atunci trebuie să utilizați un mecanism de referință (un link către adresa buffer-ului de date), de exemplu:

ofstream fout(nume fișier, ios::app | ios::binary);

fout.write(reinterpret_cast (& cb), sizeof(float));

Acum este necesar să discutăm al doilea parametru al funcțiilor luate în considerare. În acest program, ca al doilea parametru am folosit expresia N*sizeof(int), cu care am calculat numărul de octeți. De exemplu, dacă avem 5 elemente de matrice întregi, atunci numărul de octeți va fi 20. Funcția sizeof() returnează numărul de octeți alocați pentru tipul de date specificat ca parametru. De exemplu, sizeof( int) va reveni 4.

Deci, programul dat în acest exemplu vă permite să scrieți date în formă binară în fișierul bin.dat și să le citiți din acest fișier binar. Mai mult decât atât, după citire, aceste date sunt convertite în tipul int, capătă o structură matrice și orice operație poate fi efectuată cu aceasta.

Acum, imaginați-vă că trebuie să scrieți un program care vă permite să citiți date din fișierul bin.dat și știm doar că acest fișier conține elementele unui tablou întreg în formă binară. Numărul de elemente scrise ( N ) nu știm. Când creăm un program, nu avem dreptul de a folosi o matrice constantă, adică. alocați-i memorie în etapa creării programului. Acest lucru va duce la un rezultat eronat. Deoarece o valoare N prea mică va duce la nu toate elementele matricei să fie numărate, iar o valoare N prea mare va duce la umplerea celulelor suplimentare cu valori aleatorii.

Să luăm în considerare un exemplu de program care vă permite să citiți elementele unui tablou întreg dintr-un fișier binar prin alocarea dinamică a memoriei și, pentru a demonstra realismul datelor citite, calculați suma acestora.

#include

#include

#include

folosind namespace std;

int N, i, sum=0, dfb; //dfb - lungimea fișierului în octeți

ifstream fin("c:\\os\\bin.dat", ios::binar);

if(!fin) ( cout<< "Oshibka otkrytiya faila!"; getch(); return 1; }

fin.seekg(0, ios::end);//setează poziția de citire la sfârșitul fișierului (0 octeți de la sfârșit)

dfb = fin.tellg();// obțineți valoarea poziției de la sfârșitul fișierului (în octeți)

N=dfb/4;//știind că un număr întreg are 4 octeți, calculează numărul de numere

int *arr = int nou [N];//creăm o matrice dinamică

fin.seekg(0, ios::beg);//înainte de a citi datele, mutați poziția curentă la începutul fișierului

fin.read(reinterpret_cast (arr), dfb);

cout<< "Iz faila schitano " << N << " elementov:" << endl;

pentru(i=0; i

pentru(i=0; i

cout<< "\n Ih summa = " << sum;

getch(); întoarce 0;

Să aruncăm o privire mai atentă la acest program, în care am folosit activ funcțiile seekg() și tellg(), care sunt metode ale clasei ifstream. Trebuie remarcat aici că Orice fișier atunci când este deschis este asociat cu o așa-numită poziție curentă de citire sau scriere. Când un fișier este deschis pentru citire, această poziție implicită este setată la începutul fișierului. Dar destul de des este necesar să controlați manual poziția pentru a putea citi și scrie pornind de la o locație arbitrară din fișier. Funcțiile seekg() și tellg() vă permit să setați și să verificați indicatorul de citire curent, în timp ce funcțiile seekp() și tellp() fac același lucru pentru pointerul de scriere.

Metoda seekg(1_parameter, 2_parameter) mută poziția curentă de citire din fișier cu numărul de octeți specificat în parametrul 1 în raport cu locația specificată în parametrul 2. 2_parameter poate lua una dintre cele trei valori:

ios::beg – de la începutul fișierului;

ios::cur – din poziția curentă;

ios::end – de la sfârșitul fișierului.

Aici beg, cur și end sunt constante definite în clasa ios, iar simbolurile:: reprezintă operația de acces la această clasă. De exemplu, operatorul fin.seekg(-10, ios::end); vă permite să setați poziția curentă de citire dintr-un fișier la 10 octeți înainte de sfârșitul fișierului.

Acum să revenim la descrierea funcționării programului. Pe baza faptului că nu știm numărul de numere scrise în fișier, trebuie mai întâi să aflăm numărul de numere. Pentru a face acest lucru, folosind fin.seekg(0, ios::end); trecem la sfârșitul fișierului și, folosind funcția tellg(), returnăm lungimea fișierului în octeți variabilei dfb. Funcția tellg() returnează poziția curentă a indicatorului în octeți. Deoarece știm lungimea unui număr întreg în octeți (4 octeți), este ușor să calculăm numărul de numere scrise în fișier, știind lungimea fișierului în octeți ( N=dfb/4;). După ce am aflat numărul de numere, creăm o matrice dinamică și trecem la începutul fișierului pentru a începe să citim datele folosind funcția read(). După ce numărul specificat de octeți de date (dfb) este transferat în bufferul de date (arr), datele citite în acest fel capătă o structură matrice și devin pe deplin potrivite pentru orice operațiuni și transformări de cod.

Lucrul cu fișiere binare

Toate informațiile sunt stocate în computer sub formă de 0 și 1, adică în formă binară. Fișierele binare diferă de fișierele text numai prin metodele de lucru cu acestea. De exemplu, dacă scriem numărul „4” într-un fișier text, atunci acesta este scris ca un caracter și este nevoie de un octet pentru a-l stoca. În consecință, dimensiunea fișierului va fi egală cu un octet. Un fișier text care conține intrarea: „145687” va avea dimensiunea de șase octeți.

Dacă scriem întregul 145.687 într-un fișier binar, acesta va avea o dimensiune de patru octeți, deoarece este necesar pentru stocarea datelor int. Adică, fișierele binare sunt mai compacte și, în unele cazuri, mai ușor de procesat.

Scrierea tipurilor de date standard în fișiere binare

Pentru a deschide un fișier binar, trebuie să setați modul de acces la ios::binary (în unele compilatoare C++, ios::bin).

Pentru a crea un fișier de ieșire, creați un obiect:

ofstream outBinFile("out.bin", ios::out | ios::binary);

/* crearea unui obiect de clasă ofstream afară. coșul de gunoi

dacă (! out_f i 1) //verificare standard

Datele sunt scrise folosind metoda write(), care are doi parametri: primul este un pointer la începutul (adresa de pornire) a datelor care sunt scrise, al doilea este numărul de octeți care trebuie scrisi. În acest caz, indicatorul trebuie convertit în mod explicit la tipul char.

Exemplul 1. Scrieți variabile de diferite tipuri într-un fișier binar:

ofstream outBinFile ("test.bin", ios::out I

ios: :binar) ; /^crearea unui obiect de clasă de pârâu și încercând să-l conecteze la un fișier test. coșul de gunoi în modul de scriere a fișierelor binar */

int a - 145687; //declararea unei intregi variabile O

outBinFi le. scrie ((car*) &a, sizeof (a)) ; /^ scrie în fișier

variabilă O ca un flux de octeți, adică scrierea într-un fișier a reprezentării interne a întregii variabile a */ float x - 123,25; // declararea unei variabile reale X

outBinFile .write ((car*) &x, sizeof (x)) ; /^ scrie în fișier

variabilă X ca un flux de octeți, adică scrierea într-un fișier a reprezentării interne a întregii variabile x*/

//definirea unei variabile simbolice Cu şi iniţializandu-l cu simbolul g outBinFile.write((char*)&c, sizeof(c));

//înregistrați un simbol g a dosar

outBinFile.close(); întoarce 0;

Dacă deschideți conținutul fișierului .bin de testare cu un editor de text, acesta va arăta astfel:

iar dimensiunea fișierului va fi de 9 octeți.

Citirea tipurilor de date standard din fișiere binare

Pentru a deschide un fișier binar existent pentru citire, trebuie să creați un obiect:

ifstream inpBinFile("inp.bin", ios::in I ios::binary);

/* folosim o disjuncție de steaguri care indică faptul că fișierul este deschis pentru citire în formă binară */

dacă (! inpBinFile)

coutPentru a citi datele, folosim funcția read(), care are parametri similari cu funcția write().

#include folosind namespace std; int main()

ifstream inpBinFile("test.bin", ios::in I

ios::binar); / / deschide fișierul pentru citire în formă binară

int a; float x; char c = "g";

inpBinFile.read((char*)&a, sizeof(a));

//citește o variabilă întreagă inpBinFile.read((char*)&x, sizeof(x));

//citește o variabilă reală inpBinFile.read((char*)&c, sizeof (c));

//citește o variabilă simbolică

inpBinFile.close(); cout

Rezultatul programului:

a = 145687 x = 123,25 s = g

Vă rugăm să rețineți că nu are loc conversie de informații atunci când utilizați funcțiile de scriere și citire. Reprezentarea internă a datelor este scrisă și citită din fișier. De aceea cele două programe anterioare au dat rezultatul corect.

Scrierea și citirea tipurilor de date personalizate în fișiere binare

Spre deosebire de fișierele text, lucrul cu tipuri de date personalizate folosind fișiere binare nu este diferit de tipurile de date standard. Metodele write() și read() sunt utilizate în mod similar. Programatorul trebuie doar să indice adresa secțiunii de memorie care urmează să fie scrisă și numărul de octeți care urmează să fie scris, ținând cont că nu are loc conversie de date, se scrie și se citește doar reprezentarea internă a informațiilor.

De asemenea, atunci când lucrați cu fișiere binare, se pot folosi metodele seekg(), tellg(), seekp(), tellp().

Exemplul 3. Scrieți un program care scrie informații despre un grup de turiști într-un fișier binar.

fstream BinFile("ankety.bin", ios::in I ios::out | ios::binary);

Anketa Gruppa = ; pentru (int i = 0; i

BinFile.write((char*)&Gruppa[i], sizeof(Anketa)); BinFile.close(); întoarce 0;

Exemplul 4. Fișierul „ankety.bin” conține date despre un grup de turiști, este necesar să îl citiți și să îl afișați pe ecran.

#include folosind namespace std; struct chestionar (

nume char; int vârsta;

tip de date structurale Chestionar la ecran*/

ostream& operator

fstream BinFile("ankety.bin", ios::in | ios::out | ios::binary); dacă (!BinFile)

pentru (int i = 0; i

//citește imediat toți octeții ocupați de variabila de tip Anketa BinFile.read((char*)&Gruppa[i], sizeof(Anketa));

BinFile.close(); întoarce 0;

Rezultatul programului:

Ivanov, 23 Sidorov, 21 Petrov,22

Pentru a continua, apăsați orice tastă. . .

Dezvoltarea propriilor clase pentru lucrul cu fișiere

Este incomod să folosești în mod constant metodele write() și read() este mult mai plăcut să poți folosi operațiunile „>” prin analogie cu fișierele text; Să dăm un exemplu de implementare a clasei noastre pentru lucrul cu fișiere binare.

folosind namespace std;

struct Chestionar //declară o structură pentru stocarea informațiilor

/*supraîncărcați operația de inserare într-un flux pentru ieșire personalizată

tip de date structurale Chestionar la ecran*/

ostream& operator

clasa outBinaryFile: public of stream /^ definește clasa noastră pentru lucrul cu fișiere binare de ieșire. O derivăm din clasa pentru lucrul cu fluxuri de fișiere de ieșire */

/*când descrieți constructorul unei clase generate, nu uitați să apelați constructorul clasei de bază, trecându-i parametrii necesari*/

outBinaryFile(car* nume): ofstream(nume, ios::out I ios::binar)

//supraîncărcați operațiile necesare ca metode de clasă operator outBinaryFile&

scrie((char*)&chislo, sizeof(chislo)); returnează *aceasta;

operator outBinaryFile&

scrie((car*)&ank, sizeof(ank)); returnează *aceasta;

clasa inpBinaryFile: public if stream /* Definim clasa noastră pentru lucrul cu fișiere binare de intrare. O derivăm din clasa pentru lucrul cu fluxuri de fișiere de intrare */

inpBinaryFile(char* name): ifstream(nume, ios::in I ios::binary)

/*apelarea constructorului clasei de bază cu parametrii necesari,

suficient pentru constructorul clasei derivate */

//supraîncărcați operațiunile necesare

inpBinaryFile& operator >> (int& number)

read((char*)&chislo, sizeof(chislo)); returnează *aceasta;

inpBinaryFile& operator >> (Anketa& ank)

read((char*)&ank, sizeof(ank)); returnează *aceasta;

int a = 111, b = 112; outBinaryFile outFile("dannye.bin");

//deschideți fișierul pentru citire

inpBinaryFile inpFile("dannye.bin"); dacă (!inpFile)

pentru (int i = 0; i

inpFile >> a; //citește profilul din fișier

cout //și afișează-l pe ecran

inpFile >> chestionar; cout

Rezultatul programului:

Kolya, 1990, 582-78-95.

Pentru a continua, apăsați orice tastă. . .

1. Este posibil să folosiți o operație într-un program?

ios::in I ios::out

  • a) da, în orice caz;
  • b) da, dar numai atunci când lucrați cu fișiere text;
  • c) nu, în orice caz.
  • 2. Specificați opțiunea corectă pentru deschiderea unui fișier text pentru citire:
    • a) ifstream inpF("input.txt", ios::in);
    • b) ifstream inpF("input.txt", ios::input);
    • c) ifstream inpF(ios:in, "input.txt").

H. Ce va fi afișat pe ecran ca urmare a executării următorului cod?

inputFile.get(c);

următorul - inputFile.peek();

dacă (următorul == EOF)

  • a) conținutul fișierului asociat fluxului inputFile va fi afișat pe ecran o dată;
  • b) conținutul fișierului asociat fluxului inputFile va fi afișat pe ecran de un număr infinit de ori;
  • c) nu va fi afișat nimic pe ecran.
  • 4. Câte caractere sunt în fișier?
  • 12 3 4 5 6
  • a) 6;
  • b) 7;
  • c) 11.
  • 5. Ce metode vă permit să determinați sfârșitul unui fișier?
  • a) eof();
  • b) bun();
  • c) ambele metode.
  • 6. Care este scopul funcției getline()?
  • a) citește un cuvânt dintr-un fișier;
  • b) citește întregul conținut al fișierului;
  • c) citește o linie dintr-un fișier.
  • 7. Pentru a scrie/citi tipuri de date personalizate într-un fișier, trebuie să:
    • a) supraîncărcați operațiunile „>>” și ​​„
    • b) scrierea și citirea tipurilor de date personalizate sunt disponibile fără acțiuni suplimentare;
    • c) scrierea și citirea tipurilor de date personalizate în fișier este imposibilă.
  • 8. Ce funcții sunt folosite pentru a scrie/citi informații în formă binară?
  • a) printf / scanf;
  • b) scrie/citește;
  • c) pune/primi.
  • 1. Scrieți un program care scrie literele alfabetului englez într-un fișier.
  • 2. Fișierul input.txt conține informații din mai multe linii de text. Afișați conținutul acestui fișier pe ecran, numărați numărul de linii din fișier.
  • 3. Discul conține fișierul result.txt cu rezultatele experimentelor chimice. Scrieți un program care creează o copie a acestui fișier numit copy_resylt.txt.
  • 4. Introduceți numele fișierului folosind tastatura. Ștergeți toate liniile pare din fișierul specificat.
  • 5. Scrieți un program care, într-un fișier text, înlocuiește toate literele mici cu majuscule și invers.
  • 6. Fișierul text sursă conține numere separate prin spații. Generați două fișiere noi: primul ar trebui să conțină numai numere pare, iar al doilea - impar.
  • 7. Fișierul conține numere reale. Scrieți un program care aruncă partea fracționară a acestor numere și le scrie într-un fișier nou.
  • 8. Un fișier text conține informații despre zborurile companiilor aeriene. Selectați zborurile care pleacă după-amiaza din aceste date și afișați-le pe ecran.
  • 9. Supraîncărcați >> și operatorii
  • 10. Scrieți propria clasă pentru a lucra cu fișiere binare.
  • 11. Scrieți lista celor 10 elevi din clasă într-un fișier text și într-un fișier binar. Comparați aceste fișiere. Explicați diferența rezultată.
  • 12. Dezvoltați o clasă care scrie informații despre mașini (an de fabricație, marca, culoare etc.) într-un fișier text. În acest caz, fiecare simbol de informare este înlocuit cu propriul său cod ABO 1. Afișați fișierul rezultat pe ecran.

Întrebări de securitate

  • 1. Ce clase sunt folosite pentru a lucra cu fluxuri de fișiere?
  • 2. Ce moduri de acces pot fi folosite atunci când lucrați cu fișiere? Dați exemple.
  • 3. Ce metodă este folosită pentru a deschide un fișier? Dați exemple.
  • 4. Ce operațiuni sunt disponibile pentru lucrul cu fișiere? Ce funcții sunt prevăzute pentru efectuarea acestor operații?
  • 5. Ce metode vă permit să determinați sfârșitul unui fișier atunci când citiți informații din acesta? Care este diferența dintre aceste metode? Dați exemple.
  • 6. Cum puteți citi variabilele tipurilor de date standard din fișierele text?
  • 7. Este posibil să citiți variabile de tip de date personalizate din fișierele text?
  • 8. Ce funcții sunt concepute pentru a citi aleatoriu informații dintr-un fișier? Dați exemple.
  • 9. Denumiți caracteristicile fișierelor binare. Care sunt avantajele utilizării unor astfel de fișiere?
  • 10. Ce funcții pot fi folosite pentru a scrie/citi informații în fișiere binare?
  • 11. Cum se citesc variabilele tipurilor de date standard dintr-un fișier binar?
  • 12. Ce considerații trebuie luate în considerare atunci când citiți tipuri de date personalizate din fișiere binare?
  • „Ivanov”, 23), („Sidorov”, 21),