• binární soubor. Zápis a čtení vlastních datových typů do binárních souborů

    Pravděpodobně jste se setkali s pojmy „text“ a „binární“ při čtení některých článků o . A oni usoudili, že to všechno je pro vás příliš těžké, nemůžete na to přijít navždy, takže se do toho neponořili a mávli nad tím rukou.

    Pokusíme se vše co nejvíce vysvětlit. prostá řeč, protože takové informace jsou užitečné pro každého uživatele, i pro nejnezkušenějšího, protože přímo souvisí se základy počítačové bezpečnosti.

    Trochu teorie

    Textový soubor obsahuje znaky ASCII (zkratka znamená American Standardní kód pro informaci Interchange, něco jako "American Standard Encoding for Information Interchange").

    ASCII je ve skutečnosti tabulka, ve které je každému písmenu, číslu, interpunkčnímu znaménku a různým „psům“ se „sněhovými vločkami“ (ve smyslu @ a *) přidělen jeden bajt. Tedy osm nul a jedniček (bitů). Plus samozřejmě ovládat postavy jako nový řádek.

    Otvírač souborů ASCII převádí bajty na písmena, čísla a další tisknutelné znaky na displeji. Software samozřejmě musí rozumět té části tabulky, která odpovídá ruskému jazyku, ale to je již otázka kódování.

    V binárním souboru jsou nuly a jedničky uspořádány do sekvencí, které nejsou nutné pro zobrazení textů (ačkoli existují, například *doc). A za co, ptáte se. Odpověď je jednoduchá: všechno ostatní. Programy, filmy, hudba, obrázky – každý formát má své vlastní strukturální principy pro organizaci dat.

    Samotné slovo „binární“ znamená „skládající se ze dvou složek“, „dvojitý“. Jasně definovat lze skutečně pouze dvě složky – nulu a jedničku, bity, „cihly“, které tvoří soubor. Význam všeho ostatního se může objevit až při spuštění (otevření, přehrávání).

    Spodní strana digitálního světa

    Do binárního souboru se můžete podívat pomocí speciální program- HEX editor. (Od slova Hexadecimal, označující hexadecimální číselnou soustavu.) Takový software ukazuje bajty ve formě jejich označení HEX, které jsou vlastně také uspořádány ve formě tabulky (matice).

    Například bajty obrázku v formát JPEG, běžný obrázek nebo fotografie, se v okně editoru zobrazí jako FF D8 FF 00 04 3A 29 a tak dále.

    Specialista pochopí, že sekvence bajtů FF D8 na samém začátku naznačuje, že máme před sebou JPEG. A pro laiky to není až tak zajímavé.

    V HEX editoru můžete otevřít a textový soubor abyste viděli, které bajty odpovídají konkrétním písmenům (znakům ASCII). Ale jen ze zvědavosti to stejně nedává smysl.

    Ale stává se, že binární soubory jsou prohlíženy v hexadecimální formě s docela smysluplnými a konkrétními cíli. Specialisté z antivirových laboratoří například takto vyhledávají škodlivý kód připojený k hlavnímu kódu. Mimochodem, přejděme k bezpečnostním otázkám.

    Co může škodit

    Textový soubor nemůže obsahovat nic jiného než znaky ASCII. Programy však nejsou pouze binární, ale skládají se také z výše uvedených symbolů. Myslím skripty, samozřejmě.

    Jinými slovy, soubor *txt v zásadě není infikován a nepředstavuje hrozbu. A pokud je v textovém souboru skript, pak může nadělat spoustu problémů.

    Například soubor *bat obsahuje kód různých příkazů a spouští se dvojitým kliknutím, as pravidelný program. Tyto příkazy jsou napsány ve znacích ASCII, ale operační systém je umí interpretovat – převést je na nuly a jedničky, které jsou pro programy typické.

    Ale určitě neklikáte na neznámé netopýří soubory, že? To je dobré.

    Předchozí publikace:

    Poslední úprava: 2012-11-06 14:45:16

    Materiálové štítky: ,

    Práce s binárními soubory

    Všechny informace jsou v počítači uloženy ve tvaru 0 a 1, tedy v binární podobě. Binární soubory se liší od textových souborů pouze způsobem, jakým se s nimi zachází. Pokud například zapíšeme do textového souboru číslo „4“, pak se zapíše jako znak a k jeho uložení je potřeba jeden bajt. Podle toho bude velikost souboru rovna jednomu bajtu. Textový soubor obsahující položku: "145687" bude mít velikost šest bajtů.

    Pokud zapíšeme celé číslo 145687 do binárního souboru, bude mít velikost čtyři bajty, protože tolik je potřeba k uložení dat typu int. To znamená, že binární soubory jsou kompaktnější a v některých případech snadněji zpracovatelné.

    Zápis standardních datových typů do binárních souborů

    Chcete-li otevřít binární soubor, musíte nastavit režim přístupu na ios::binary (v některých kompilátorech C++ ios::bin).

    Chcete-li vytvořit výstupní soubor, vytvořte objekt:

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

    /* vytvoření objektu třídy outstream ven. zásobník

    pokud (! out_f a 1) //standardní kontrola

    Data se zapisují pomocí metody write () , která má dva parametry: první je ukazatel na začátek (počáteční adresa) zapisovaných dat, druhý je počet bajtů k zápisu. V tomto případě musí být ukazatel explicitně převeden na typ char.

    Příklad 1 Zapište proměnné různých typů do binárního souboru:

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

    ios: :binary); /^vytvoření objektu třídy proudu a pokusit se jej propojit se souborem test. zásobník v režimu binárního zápisu */

    int a - 145687; //deklarace celočíselné proměnné A

    outBinFile. napsat ((char*) &a, sizeof(a)) ; /^zápis do souboru

    variabilní A jako proud bajtů, tedy zápis do souboru vnitřní reprezentace celočíselné proměnné a */ float x - 123,25; // deklarace skutečné proměnné X

    outBinFile .write ((char*) &x, sizeof(x)) ; /^zápis do souboru

    variabilní X jako proud bajtů, tedy zápis do souboru vnitřní reprezentace celočíselné proměnné x*/

    //definice znakové proměnné S a jeho inicializaci pomocí g outBinFile.write((char*)&c, sizeof(c));

    //zadání znaku G do souboru

    outBinFile.close(); návrat 0;

    Pokud otevřete obsah testovacího souboru .bin pomocí textového editoru, bude vypadat takto:

    a velikost souboru bude 9 bajtů.

    Čtení standardních datových typů z binární soubory

    Chcete-li otevřít existující binární soubor pro čtení, musíte vytvořit objekt:

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

    /* použijte disjunkci příznaků označujících, že soubor je otevřen pro čtení v binární formě */

    if(!inpBinFile)

    cout Ke čtení dat používáme funkci read(), která má parametry podobné funkci write().

    #include using namespace std; int main()

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

    ios: :binary); / / otevřít soubor pro čtení v binární podobě

    int a; plovák x; char c = "g";

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

    //přečtení celočíselné proměnné inpBinFile.read((char*)&x, sizeof(x));

    //čtení skutečné proměnné inpBinFile.read((char*)&c, sizeof(c));

    //přečtení znakové proměnné

    inpBinFile.close(); cout

    Výsledek programu:

    a = 145 687 x = 123,25 c = g

    Všimněte si, že při použití funkcí zápisu a čtení nedochází k žádné konverzi informací. Vnitřní reprezentace dat se zapisuje do souboru a čte ze souboru. To je důvod, proč dva předchozí programy poskytly správný výsledek.

    Zápis a čtení vlastních datových typů do binárních souborů

    Na rozdíl od textových souborů se práce s vlastními datovými typy pomocí binárních souborů neliší od standardních datových typů. Podobně se používají metody write() a read(). Programátor potřebuje pouze specifikovat adresu paměťové oblasti, která má být zapsána, a počet zapsaných bytů, přičemž bere v úvahu, že nedochází ke konverzi dat, pouze se zapisuje a čte vnitřní reprezentace informací.

    Při práci s binárními soubory lze také použít metody seekg(), tellg(), seekp(), tellp().

    Příklad 3 Napište program, který zapíše informace o skupině turistů do binárního souboru.

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

    Skupina dotazníků = ; for (int i = 0; i

    BinFile.write((char*)&Gruppa[i], sizeof(Anketa)); BinFile.close(); návrat 0;

    Příklad 4 Soubor "ankety.bin" obsahuje údaje o skupině turistů, je nutné je načíst a zobrazit na obrazovce.

    #include using namespace std; strukturální otázka (

    charname; int věk;

    strukturální datový typ Dotazník na obrazovce*/

    stream a operátor

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

    for (int i = 0; i

    //okamžitě přečte všechny bajty obsazené proměnnou typu Anketa BinFile.read((char*)&Gruppa[i], sizeof(Anketa));

    BinFile.close(); návrat 0;

    Výsledek programu:

    Ivanov, 23 Sidorov, 21 Petrov, 22

    Pokračujte stiskem libovolné klávesy. . .

    Vývoj vlastních tříd pro práci se soubory

    Je nepohodlné neustále používat metody write() a read(), mnohem hezčí je mít možnost používat operace ">" analogicky s textovými soubory. Uveďme si příklad implementace naší třídy pro práci s binárními soubory.

    pomocí jmenného prostoru std;

    struct Otázka //deklarování struktury pro ukládání informací

    /* přetížení operace vložení do proudu pro výstup vlastního

    strukturální datový typ Dotazník na obrazovce*/

    stream a operátor

    třída outBinaryFile: public of stream /^definujeme naši třídu pro práci s výstupními binárními soubory. Vygenerujeme jej z třídy pro práci s výstupními proudy souborů */

    /* při popisu konstruktoru generované třídy nezapomeňte zavolat konstruktor základní třídy a předat mu potřebné parametry */

    outBinaryFile(char* name) : ofstream(name, ios::out I ios::binary)

    //přetíží potřebné operace jako metody třídy outBinaryFile& operátor

    write((char*)&chislo, sizeof(chislo)); vrátit *toto;

    outBinaryFile& operátor

    write((char*)&ank, sizeof(ank)); vrátit *toto;

    class inpBinaryFile: public if stream /* definujeme naši třídu pro práci se vstupními binárními soubory. Vygenerujeme jej z třídy pro práci se vstupními proudy souborů */

    inpBinaryFile(char* název) : ifstream(název, ios::v I ios::binární)

    /*zavoláme konstruktor základní třídy s požadovanými parametry,

    dost pro konstruktor odvozené třídy */

    //přetížení potřebných operací

    inpBinaryFile& operátor >> (int& číslo)

    read((char*)&chislo, sizeof(chislo)); vrátit *toto;

    inpBinaryFile& operátor >> (Anketa& ank)

    read((char*)&ank, sizeof(ank)); vrátit *toto;

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

    // otevřete soubor pro čtení

    inpBinaryFile inpFile("dannye.bin"); if (!inpFile)

    for (int i = 0; i

    inpFile >> a; //přečtěte si dotazník ze souboru

    cout //a zobrazí se na obrazovce

    inpFile >> anketa; cout

    Výsledek programu:

    Kolja, 1990, 582-78-95.

    Pokračujte stiskem libovolné klávesy. . .

    1. Je možné použít operaci v programu?

    ios::v I ios::out

    • a) ano, v každém případě;
    • b) ano, ale pouze při práci s textovými soubory;
    • c) Každopádně ne.
    • 2. Zadejte správnou volbu pro otevření textového souboru pro čtení:
      • a) ifstream inpF("vstup.txt", ios::in);
      • b) ifstream inpF("vstup.txt", ios::vstup);
      • c) ifstream inpF(ios:in, "vstup.txt").

    H. Co se zobrazí jako výsledek provedení následujícího kódu?

    inputFile.get(c);

    další - inputFile.peek();

    if (další == EOF)

    • a) obsah souboru spojeného s proudem inputFile se zobrazí jednou;
    • b) na obrazovce se zobrazí obsah souboru spojeného s proudem inputFile nekonečné číslo jednou;
    • c) na obrazovce se nic nezobrazí.
    • 4. Kolik znaků je v souboru?
    • 12 3 4 5 6
    • a) 6;
    • b) 7;
    • v 11.
    • 5. Jaké metody umožňují určit konec souboru?
    • a) eof();
    • b) dobrý();
    • c) oba tyto způsoby.
    • 6. Jaký je účel funkce getline()?
    • a) přečte slovo ze souboru;
    • b) přečte celý obsah spisu;
    • c) přečte řádek ze souboru.
    • 7. Chcete-li zapisovat/číst uživatelem definované datové typy do souboru, musíte:
      • a) přetížit operace ">>" a "
      • b) zápis a čtení uživatelsky definovaných datových typů jsou dostupné bez dalších akcí;
      • c) zápis a čtení uživatelsky definovaných datových typů do souboru není možný.
    • 8. Jaké funkce se používají k zápisu / čtení informací v binární podobě?
    • a) printf/scanf
    • b) psát / číst;
    • c) dát / dostat.
    • 1. Napište program, který zapíše písmena anglické abecedy do souboru.
    • 2. Soubor input.txt obsahuje informace z několika textových řádků. Zobrazte obsah tohoto souboru na obrazovce, spočítejte počet řádků v souboru.
    • 3. Disk obsahuje soubor result.txt s výsledky chemických pokusů. Napište program, který vytvoří kopii tohoto souboru s názvem copy_resylt.txt.
    • 4. Pomocí klávesnice zadejte název souboru. V zadaný soubor odstraňte všechny sudé čáry.
    • 5. Napište program, který v textovém souboru nahradí všechna malá písmena velkými písmeny a naopak.
    • 6. Zdrojový textový soubor obsahuje čísla oddělená mezerami. Vygenerujte dva nové soubory: první by měl obsahovat pouze sudá čísla a druhý - lichý.
    • 7. Soubor obsahuje reálná čísla. Napište program, který odstraní zlomkovou část těchto čísel a zapíše je do nového souboru.
    • 8. Informace o letech letecké společnosti jsou zaznamenány v textovém souboru. Vyberte z těchto údajů lety s odletem odpoledne a zobrazte je na obrazovce.
    • 9. Přetížení operátorů >> a
    • 10. Napište si vlastní třídu pro práci s binárními soubory.
    • 11. Napište seznam 10 studentů ve třídě do textového souboru a binárního souboru. Porovnejte tyto soubory. Vysvětlete výsledný rozdíl.
    • 12. Vytvořte třídu, která zapisuje informace o autech (rok výroby, značka, barva atd.) do textového souboru v souboru. V tomto případě je každý symbol informace nahrazen svým ABO 1-kódem. Zobrazte výsledný soubor na obrazovce.

    Kontrolní otázky

    • 1. Jaké třídy se používají pro práci se souborovými proudy?
    • 2. Jaké režimy přístupu lze použít při práci se soubory? Dát příklad.
    • 3. Jaká metoda se používá k otevření souboru? Dát příklad.
    • 4. Jaké operace jsou dostupné pro práci se soubory? Jaké funkce jsou určeny k provádění těchto operací?
    • 5. Jaké metody umožňují určit konec souboru při čtení informací z něj? Jaký je rozdíl mezi těmito metodami? Dát příklad.
    • 6. Jak lze číst proměnné standardních datových typů z textových souborů?
    • 7. Je možné číst proměnné uživatelských datových typů z textových souborů?
    • 8. Jaké funkce jsou určeny k náhodnému čtení informací ze souboru? Dát příklad.
    • 9. Pojmenujte vlastnosti binárních souborů. Jaké jsou výhody používání takových souborů?
    • 10. Jaké funkce lze použít k zápisu/čtení informací do binárních souborů?
    • 11. Jak číst proměnné standardních datových typů z binárního souboru?
    • 12. Jaké jsou úvahy při čtení uživatelských datových typů z binárních souborů?
    • "Ivanov", 23), ("Sidorov", 21),

    Popis a vnitřní reprezentace souborů

    Soubory jsou různé. Všechny soubory uložené v počítači mají speciální atributy, tzn. zvláštní způsoby popisy k rozlišení jednoho souboru od druhého: 1) jméno; velikost 2; 3) datum a čas; 4) ikona.

    Každý soubor má svůj název – název souboru. Název souboru popisuje jeho obsah nebo naznačuje, k čemu může být použit. Název je přiřazen souboru při jeho vytvoření. To platí pro všechny soubory.

    Každý soubor má fyzickou velikost. Soubor zabírá část paměti počítače a místo na disku.

    Když je soubor vytvořen, operační systém jej označí datem a časem vytvoření. To vám umožní třídit soubory podle data a času a tak vyčistit počítač. Je také uvedeno datum a čas, kdy byl soubor aktualizován nebo upraven.

    Každý soubor je specifického typu, úzce souvisí s ikonou souboru, kterou vidíme. Typ souboru závisí na jeho obsahu. Každý program přiřadí vygenerovanému dokumentu specifický typ a odpovídající ikonu.

    Velikost souboru se měří v bajtech, stejně jako velikost paměti.

    Velikost souboru může být 0 bajtů, což znamená, že soubor existuje, ale sám o sobě nic neobsahuje. S Maximální velikost soubor - 4 GB. Ale takové obrovské soubory jsou velmi vzácné.

    Vestavěné hodiny počítače jsou potřebné zejména pro přiřazení času a data vytvoření souborům. To vysvětluje, jak důležité je správně nastavit tyto hodiny. Existují také další atributy například pro popis souborů systémové soubory, skryté soubory, soubory pouze pro čtení, archivní soubory atd. operační systém vypořádat se s tím po svém.

    Každý soubor má jedinečný index. Index obsahuje informace, které jakýkoli proces potřebuje k přístupu k souboru. Zpracovává přístupové soubory pomocí dobře definované sady systémová volání a identifikaci souboru pomocí řetězce znaků sloužících jako název složeného souboru. Každý složený název jednoznačně identifikuje soubor, takže jádro převede název do indexu souboru. Index obsahuje tabulku adres umístění informací o souboru na disku. Protože každý blok na disku je adresován svým číslem, tato tabulka ukládá sbírku čísel diskových bloků. Pro větší flexibilitu připojuje jádro k souboru jeden blok po druhém, což umožňuje rozptýlení informací o souboru. souborový systém. Ale takové rozložení komplikuje úkol najít data. Tabulka adres však obsahuje seznam čísel bloků obsahujících informace patřící k souboru jednoduché výpočty ukazují, že lineární seznam bloků souborů v indexu je obtížné spravovat. Aby se s malou indexovou strukturou dalo pracovat velké soubory, je tabulka adres bloku disku uvedena do souladu se strukturou.

    Textové a binární soubory

    Soubory umožňují uživateli číst velké množství dat přímo z disku, aniž by je musel zadávat z klávesnice. Existují dva hlavní typy souborů: textové a binární.

    Text se nazývají soubory skládající se z libovolných znaků. Jsou uspořádány do řádků, z nichž každý končí znakem " konec čáry". Konec samotného souboru je označen symbolem " konec souboru". Při zápisu informací do textového souboru, který lze zobrazit pomocí libovolného textový editor, všechna data jsou převedena na typ znaku a uložena ve znakové formě.

    v binárním X soubory informace se čtou a zapisují ve formě bloků určité velikosti, do kterých lze ukládat data jakéhokoli druhu a struktury.

    Pro práci se soubory se používají speciální datové typy, tzv proudy. Proud ifstream se používá pro práci se soubory v režimu čtení a ifstream v režimu zápisu. Pro práci se soubory v režimu zápisu i čtení se používá stream ifstream.

    V programech C++ je při práci s textovými soubory nutné zahrnout knihovny ifstream a iostream.

    Chcete-li zapsat data do textového souboru, musíte: 1) popsat typ proměnné outstream OTEVŘENO; 3) výstup informací do souboru; 4) nezapomeňte soubor zavřít.

    Chcete-li číst data z textového souboru, musíte:

    1) popište typovou proměnnou ifstream; 2) otevřete soubor pomocí funkce OTEVŘENO; 3) číst informace ze souboru, při čtení každé části dat je nutné zkontrolovat, zda bylo dosaženo konce souboru; 4) zavřete soubor.

    Je třeba poznamenat, že ve všech výše diskutovaných příkladech funkce fopen() v režimech „r“ a „w“ otevírá textový soubor pro čtení a zápis. To znamená, že některé znaky pro formátování textu, jako je návrat vozíku '\r', nelze číst jako samostatné znaky, bez ohledu na to, jak v souboru existují, ale jsou tam. Toto je funkce režimu textového souboru. Pro „jemnější“ práci s obsahem souborů je zde binární režim, který představuje obsah souboru jako posloupnost bajtů, kde všechny možné řídicí kódy jsou pouze čísla. Právě v tomto režimu je možné odebrat nebo přidat řídicí znaky, které nejsou dostupné v textovém režimu. Aby bylo možné otevřít soubor v binárním režimu, používá se také funkce fopen() s posledním parametrem rovným „rb“ a „wb“ pro čtení a zápis.

    Příklady, které jsme dosud zvažovali, demonstrovaly formátovaný vstup/výstup informací do souborů. Je vhodné používat formátovaný souborový vstup/výstup čísel pouze v případě, že jsou malá a malá a také v případě, že je nutné zajistit možnost prohlížení souborů bez softwarových nástrojů. Jinak je samozřejmě mnohem efektivnější použít binární I/O, které ukládají čísla stejně jako v RAM počítače a ne ve tvaru znakové řetězce. Dovolte mi připomenout, že celočíselná (int) nebo reálná (float) hodnota zabírá 4 bajty v paměti, dvojnásobná hodnota zabírá 8 bajtů a znaková hodnota typu char- 1 bajt. Například číslo 12345 v textovém (formátovaném) souboru zabírá 5 bajtů a v binárním souboru 4 bajty.

    Binární soubory, tj. soubory, ve kterých jsou informace uloženy ve formě interní reprezentace, jsou používány pro následné použití softwarovými nástroji; nelze je prohlížet nesoftwarovými nástroji. Výhodou binárních souborů je, že za prvé při čtení/zápisu odpadá čas převádění dat z formy symbolické reprezentace do interní a naopak a za druhé nedochází ke ztrátě přesnosti. reálná čísla. Jak v případě formátovaných I/O, tak v případě binárních I/O je pro „správné“ zpracování informací ze souboru nutné vědět, jaké typy dat, jak a v jakém pořadí se zapisují binární soubor, zejména proto, že prohlížení binárního souboru pomocí textového editoru nic neudělá.

    Zvažte příklad demonstrující zápis celočíselných prvků dynamické pole do binárního souboru a jejich čtení z tohoto souboru.

    #zahrnout

    #zahrnout

    #zahrnout

    pomocí jmenného prostoru std;

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

    int *mas = new int[N];

    for(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);//vytvořit. ven. binární proud

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

    fout.write(reinterpret_cast (mas), N*velikost(int));//zápis pole do souboru

    fout.close();//uzavření streamu

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

    for(i=0; i

    ifstream fin("c:\\os\\bin.dat", ios::binary); //vytvoří proud pro čtení souboru

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

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

    fin.read(reinterpret_cast (mas), N*velikost(int));//přečtení pole ze souboru

    for(i=0; i

    getch(); návrat 0;

    Zvláštní pozornost v tomto programu by měla být věnována použití funkcí write() (metoda třídy ofstream) a read() (metoda třídy ifstream). Tyto funkce uvažují o datech v pojmech bajtů a jsou navrženy k přenosu určitého počtu bajtů z datové vyrovnávací paměti do souboru a zpět. Parametry těchto funkcí jsou adresa vyrovnávací paměti a její délka v bajtech.

    Funkce write() je navržena tak, aby zapsala do souboru počet bajtů zadaný ve druhém parametru z počtu zadaného v prvním parametru. adresy datová vyrovnávací paměť a funkce read() je navržena pro čtení dat ze souboru. Zde je třeba poznamenat, že tyto funkce pracují pouze s datovým bufferem typu char. V tomto ohledu jsme v tomto programu použili operátora reinterpret_cast<> , který převádí náš datový buffer typu int (mas) na buffer typu char.

    Je třeba mít na paměti, že typ odlévání pomocí operátoru reinterpret_cast nutné pouze v případech, kdy první parametr funkcí napsat() Ačíst() není pole znaků (protože znak typu char zabírá pouze 1 bajt). Pokud navíc potřebujete zapisovat nebo číst nikoli pole, ale jednotlivé proměnné, musíte použít referenční mechanismus (odkaz na adresu datové vyrovnávací paměti), například:

    ofstream fout(název souboru, ios::app | ios::binary);

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

    Nyní je třeba probrat druhý parametr uvažovaných funkcí. V tomto programu jsme jako druhý parametr použili výraz N * sizeof (int), pomocí kterého jsme vypočítali počet bajtů. Máme-li například 5 prvků celočíselného pole, bude počet bajtů 20. Funkce sizeof() vrací počet bajtů přidělených pro datový typ zadaný jako parametr. Například sizeof( int) se vrátí 4.

    Program uvedený v tomto příkladu vám tedy umožňuje zapisovat data v binární podobě do souboru bin.dat a číst je z tohoto binárního souboru. Navíc se tato data po přečtení převedou na typ int, získají strukturu pole a lze s nimi provádět libovolné operace.

    Nyní si představte, že potřebujete napsat program, který vám umožní číst data ze souboru bin.dat, a my víme pouze to, že tento soubor obsahuje prvky celočíselného pole v binární podobě. Počet zaznamenaných prvků ( N ) nevíme. Při tvorbě programu nemáme právo používat konstantní pole, tzn. přidělit mu paměť ve fázi vytváření programu. Výsledkem bude chybný výsledek. Protože příliš malá hodnota N povede k tomu, že nebudou brány v úvahu všechny prvky pole, a příliš velká hodnota N povede k vyplnění dalších buněk náhodnými hodnotami.

    Vezměme si příklad programu, který umožňuje číst prvky celočíselného pole z binárního souboru pomocí dynamické alokace paměti a pro prokázání realističnosti načtených dat vypočítat jejich součet.

    #zahrnout

    #zahrnout

    #zahrnout

    pomocí jmenného prostoru std;

    int N, i, součet=0, dfb; //dfb - délka souboru v bajtech

    ifstream fin("c:\\os\\bin.dat", ios::binární);

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

    fin.seek(0, ios::konec);//nastaví pozici čtení na konec souboru (od konce 0 bajtů)

    dfb = fin.tellg();//získání hodnoty pozice konce souboru (v bajtech)

    N=dfb/4;//s vědomím, že celé číslo zabírá 4 bajty, vypočítáme počet čísel

    int *arr = new int[N];// vytvoří dynamické pole

    fin.seekg(0, ios::beg);//před čtením dat přesunout aktuální pozici na začátek souboru

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

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

    for(i=0; i

    for(i=0; i

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

    getch(); návrat 0;

    Podívejme se blíže na tento program, ve kterém jsme aktivně využívali funkce seekg() a tellg(), což jsou metody třídy ifstream. Zde je třeba poznamenat, že jakýkoli soubor je při otevření spojen s tzv. aktuální pozicí pro čtení nebo zápis. Když je soubor otevřen pro čtení, tato pozice je výchozí na začátek souboru. Dost často je ale nutné ovládat polohu ručně, aby bylo možné číst a zapisovat z libovolného místa v souboru. Funkce seekg() a tellg() vám umožňují nastavit a zkontrolovat aktuální ukazatel čtení, zatímco funkce seekp() a tellp() dělají totéž pro ukazatel zápisu.

    Metoda seekg(1_parameter, 2_parameter) přesune aktuální pozici čtení ze souboru o počet bajtů zadaný v 1_parametru vzhledem k umístění zadanému v 2_parametr. 2_parameter může nabývat jedné ze tří hodnot:

    ios::beg - od začátku souboru;

    ios::cur - z aktuální pozice;

    ios::end - od konce souboru.

    Beg, cur a end jsou zde konstanty definované ve třídě ios a symboly:: označují operaci přístupu k této třídě. Například operátor fin.seekg(-10, ios::konec); umožňuje nastavit aktuální pozici čtení ze souboru 10 bajtů před koncem souboru.

    Nyní zpět k popisu programu. Na základě toho, že neznáme počet čísel zapsaných do souboru, musíme nejprve počet čísel zjistit. K tomu pomocí fin.seek(0, ios::konec); přesuneme se na konec souboru a pomocí funkce tellg() vrátíme do proměnné dfb délku souboru v bajtech. Funkce tellg() vrací aktuální pozici ukazatele v bajtech. Protože délka jednoho celého čísla v bajtech je nám známa (4 bajty), není obtížné vypočítat počet čísel zapsaných do souboru, když známe délku souboru v bajtech ( N=dfb/4;). Když jsme se naučili počet čísel, vytvoříme dynamické pole a přesuneme se na začátek souboru, abychom mohli začít číst data pomocí funkce read (). Po přenesení námi udávaného počtu datových bytů (dfb) do datové vyrovnávací paměti (arr) získají takto načtená data strukturu pole a stanou se plně vhodná pro jakékoli operace a transformace.

    záznamy ), pak je celkem pochopitelné chtít nějakým způsobem snížit nevyužité, ale zabrané množství paměti.

    Pro takové případy existují záznamy s variantní částí.

    Popis záznamu s variantní částí

    V sekci var zápis s variantní částí popiš to takto:

    var<имя_записи>: záznam<поле1>: <тип1>; [<поле2>: <тип2>;] [...] pouzdro<поле_переключатель>: <тип>z<варианты1>: (<поле3>: <тип3>; <поле4>: <тип4>; ...); <варианты2>: (<поле5>: <тип5>; <поле6>: <тип6>; ...); [...] konec;

    Nevariantní díl záznamy (před klíčovým slovem case ) se řídí stejnými pravidly jako běžný záznam. Obecně řečeno, nevariantní část může zcela chybět.

    Variantní část začíná vyhrazeným případem slova , za nímž je uvedeno pole záznamu, které později poslouží jako přepínač. Stejně jako u normálního případu musí přepínač patřit jednomu z vyjmenované typyúdaje (viz přednáška 3). Seznam možností může být konstanta, rozsah nebo spojení několika konstant nebo rozsahů. Sada polí, která musí být zahrnuta do struktury záznamu, pokud byla provedena odpovídající volba, je uzavřena v závorkách.

    Příklad. K popisu obsahu knihovny jsou nutné následující informace:

    Sloupce "Název" a "Vydavatel" jsou společné pro všechny tři možnosti a zbývající pole závisí na typu publikace. K implementaci této struktury používáme zápis s variantní částí:

    typ biblio = název záznamu, vydavatel: řetězec; case item: char of "b": (autor: string; year: 0..2004); "n": (údaje: datum); "m": (rok: 1700..2004; měsíc: 1..12; číslo: celé číslo); konec;

    V závislosti na hodnotě pole položky bude záznam obsahovat buď 4, nebo 5 nebo 6 polí.

    Mechanismus použití záznamu s variantní částí

    Počet bajtů přidělených kompilátorem pro zápis s variantní částí, je určena její nejdelší variantou. "Kratší" sady polí z ostatních možností zabírají pouze zlomek přidělené paměti.

    Ve výše uvedeném příkladu je možnost „b“ „nejdelší“: vyžaduje 23 bajtů (21 bajtů pro řetězec a 2 bajty pro celé číslo). Volby "n" a "m" vyžadují 4 resp. 5 bajtů (viz tabulka).

    jméno, vydavatel položka Variantní část
    ... "b" autor rok
    ... "n" data
    ... "m" rok Měsíc číslo
    ... "b" autor rok

    Binární soubory

    Binární soubory ukládají informace ve formě, v jaké jsou prezentovány v paměti počítače, a proto jsou pro člověka nepohodlné. Při pohledu do takového souboru není možné pochopit, co je v něm napsáno; nelze jej vytvořit ani opravit ručně - v nějakém textovém editoru - a podobně. Všechny tyto nepříjemnosti jsou však kompenzovány rychlostí práce s daty.

    Textové soubory jsou také struktury sekvenční přístup, a binárně - přímý. To znamená, že kdykoli můžete odkazovat na kohokoli, nejen na aktuální prvek.