C pentru structura dinamică începător și fișier binar, c pentru începători

C ++ fișiere binare Salvați structura dinamică într-un fișier binar

Atenție vă rog!
Puteți utiliza o dublă trecere în fișier. Primul este de a număra numărul de structuri, de a aloca numărul necesar de memorie, iar al doilea de a citi toate structurile din fișier. Această metodă este mai bună. Exemplul meu este mai puțin sigur și mai probabil să fie doar de utilizare teoretică și nu practic

Întrebarea despre cum să păstrez structura dinamică într-un fișier binar ma interesat foarte mult și imediat după prima mea experiență de a lucra cu fișiere binare cu succes. Pentru cei care tocmai au început să învețe cu ++, chiar sensul folosirii structurilor dinamice, obiectelor, claselor nu este atât de evident.

Am căutat prin căutarea lungimii și lățimii, dar nu am găsit nimic sensibil în privința asta. Practic, a fost dat un exemplu în care se folosește o variabilă statică.

Puteți utiliza metode diferite. Primele mele gânduri au fost de a număra numărul de obiecte și de a le scrie la începutul fișierului, de a le număra de acolo ca un contor și apoi de a executa un ciclu pe acest contor. Da, o astfel de opțiune este destul de normală, dar am vrut-o altfel, astfel încât să nu fie scris nimic în dosarul binar. În final, am găsit o soluție. Nu este cea mai bună cale, dar știu că mulți oameni nu se pot gândi chiar la așa ceva.

Cod C ++ Salvează / Citește structura dinamică în fișier binar

Cu alte cuvinte. Puteți scrie o structură dinamică într-un fișier, așa cum ați scrie o variabilă obișnuită.

Înregistrată în fișierul binar. Se pare că acest lucru nu este atât de dificil, dar există o chestiune de citire. Cum se citește dintr-un fișier binar mai multe structuri.

Acum, după ce am numărat totul într-o singură grămadă, toate aceste date despre indicatorul TempY pot fi afișate utilizând contorul de numărare și buclă for. Cineva poate să se calmeze și să decidă că asta este totul, că nimic altceva nu este necesar. Dar cine crede asta, va face o greșeală globală. Dacă vă aduceți aminte, veți vedea că TempY nu a fost alocată inițial memoriei, ceea ce înseamnă că orice date primite pot fi alungate din celulele sale ca coloniști ilegali. Această evacuare a datelor din celule poate duce la consecințe imprevizibile, iar poetul trebuie mutat într-un loc din care nu vor fi expulzați. Pentru aceasta, se folosește al treilea pointer. Numărul de structuri este cunoscut și numărate, deci alocăm cât mai multă memorie pentru cel de-al treilea indicator după cum este necesar și prin intermediul unui ciclu migrăm structurile dinamice dintr-o celulă nesigură la cea sigură

Ideea mea este ușor de a vă aduce în minte dacă puteți utiliza liste dinamice și în acest caz veți obține o citire în siguranță a structurilor din fișierul la un moment dat.

1. tempY a fost inițializat cu zero și apoi a început citirea ciclică a fișierului și la fiecare iterație din aceeași secțiune a memoriei (nu se știe care). Acest lucru este plin de faptul că tempY poate indica, de exemplu, o porțiune de memorie ocupată de o altă variabilă. Programul va suprascrie această variabilă și totul - un program de trei, șapte, un as - pentru programul de salut (acest lucru este cel mai bun). Pentru a scrie ceva la tempY, trebuie să alocați mai întâi memoria.

2. Deoarece x și y sunt specificate, operațiunile sizeof X și sizeof Y vor da dimensiunile indicilor, și nu întregul matrice.

Cred că ar fi mai corect să citiți și să scrieți în acest fel:

1. Scrieți fișierul:

out.write ((char *) X, sizeof (MyStruct) * 5); // deoarece X este un pointer, operatorul nu este necesar aici

2. Citirea din fișier (dacă numărul de structuri scrise în fișier este necunoscut (dar, IMHO, dacă scrieți un șir de structuri în fișier, este mai ușor să specificați dimensiunea matricei în prima linie)):

Structură MyStruct * tempY = Structură nouă MyStruct;
Structura MyStruct * temp = 0;
struct MyStruct * y = 0;
int count = 0;

std :: ifstream in;
in.open ("123.txt", std :: ios :: binar | std :: ios :: in);
în timp ce (in.read ((char *) tempY, sizeof (struct MyStruct))) numărătoarea ++;

PS: Pentru a aloca memorie în acest caz, este mai ușor să utilizați malloc / realloc, pentru a scurta codul.

Nu este o capodoperă, desigur, dar mi se pare că acest lucru va fi mai corect.

Articole similare