C Programovací tutoriál pre manipuláciu so súbormi s priamym prístupom

Väčšina programov musí okrem najjednoduchších aplikácií čítať alebo zapisovať súbory. Môže to byť len na čítanie konfiguračného súboru alebo textového analyzátora alebo niečoho sofistikovanejšieho. Tento tutoriál sa zameriava na používanie súborov s ľubovoľným prístupom v C.

Programovanie I / O súborov s náhodným prístupom v C

binárny súbor
D3Damon / Getty Images

Základné operácie so súbormi sú:

  • fopen - otvorenie súboru - uveďte, ako bude otvorený (čítanie / zápis) a typ (binárny / text)
  • fclose - zatvorenie otvoreného súboru
  • fread - čítanie zo súboru
  • fwrite - zápis do súboru
  • fseek / fsetpos - presunúť ukazovateľ súboru kamkoľvek do súboru
  • ftell / fgetpos - povie vám, kde sa nachádza ukazovateľ súboru

Dva základné typy súborov sú text a binárne. Z týchto dvoch sú binárne súbory obyčajne jednoduchšie riešiť. Z tohto dôvodu a skutočnosti, že náhodný prístup k textovému súboru nie je niečo, čo musíte často robiť, je tento návod obmedzený na binárne súbory. Prvé štyri vyššie uvedené operácie sa týkajú textových súborov aj súborov s ľubovoľným prístupom. Posledné dva len pre náhodný prístup.

instagram viewer

Náhodný prístup znamená, že sa môžete presunúť do ktorejkoľvek časti súboru a čítať alebo zapisovať údaje z neho bez toho, aby ste si museli prečítať celý súbor. Pred rokmi boli údaje uložené na veľkých kotúčoch pásky s počítačom. Jediným spôsobom, ako sa dostať k bodu na páske, bolo prečítanie celej pásky. Potom prišli disky a teraz si môžete priamo prečítať ktorúkoľvek časť súboru.

Programovanie pomocou binárnych súborov

Binárny súbor je súbor ľubovoľnej dĺžky, ktorý uchováva bajty s hodnotami v rozsahu 0 až 255. Tieto bajty nemajú na rozdiel od textového súboru žiadny iný význam, kde hodnota 13 znamená návrat riadku, 10 znamená posun riadku a 26 znamená koniec súboru. Softvér čítajúci textové súbory sa musí zaoberať týmito ďalšími význammi.

Binárne súbory sú tokom bajtov a moderné jazyky pracujú skôr s prúdmi ako so súbormi. Dôležitou súčasťou je skôr tok údajov, než odkiaľ pochádza. v C, môžete uvažovať o údajoch ako o súboroch alebo o streamoch. S náhodným prístupom môžete čítať alebo zapisovať do ktorejkoľvek časti súboru alebo prúdu. Pri postupnom prístupe musíte od začiatku preberať súbor alebo prúd ako veľkú pásku.

Táto vzorka kódu ukazuje jednoduchý binárny súbor otvorený na zápis, do ktorého sa zapisuje textový reťazec (znak *). Normálne to vidíte s textovým súborom, ale môžete písať text do binárneho súboru.

Tento príklad otvára binárny súbor na zapisovanie a potom do neho zapisuje znak * (reťazec). Premenná FILE * sa vracia z volania fopen (). Ak sa to nepodarí (súbor môže existovať a môže byť otvorený alebo len na čítanie alebo sa môže vyskytnúť chyba s názvom súboru), vráti hodnotu 0.

Príkaz fopen () sa pokúsi otvoriť zadaný súbor. V takom prípade je to test.txt v rovnakom priečinku ako aplikácia. Ak súbor obsahuje cestu, všetky spätné lomky sa musia zdvojnásobiť. "c: \ folder \ test.txt" je nesprávny; musíte použiť "c: \\ priečinok \\ test.txt".

Pretože režim súboru je „wb“, tento kód zapisuje do binárneho súboru. Súbor sa vytvorí, ak neexistuje a ak áno, odstráni sa všetko, čo v ňom bolo. Ak volanie fopen zlyhá, pravdepodobne preto, že súbor bol otvorený alebo názov obsahuje neplatné znaky alebo neplatnú cestu, fopen vráti hodnotu 0.

Aj keď by ste mohli jednoducho skontrolovať, či je ft nenulová (úspech), tento príklad má funkciu FileSuccess (), ktorá to umožňuje explicitne. Na operačnom systéme Windows vydá úspešný / neúspešný hovor a názov súboru. Je to trochu nepríjemné, ak ste po výkone, takže by ste to mohli obmedziť na ladenie. V systéme Windows existuje iba malý režijný výstup textu do ladiaceho programu systému.

Fwrite () volá výstup zadaného textu. Druhým a tretím parametrom je veľkosť znakov a dĺžka reťazca. Obidve sú definované ako size_t, ktoré je celé číslo bez znamienka. Výsledkom tohto hovoru je zapísanie počtu položiek určenej veľkosti. Všimnite si, že v prípade binárnych súborov, aj keď píšete reťazec (znak *), nepripája sa k nemu žiadny znak návratu alebo riadku. Ak ich chcete, musíte ich explicitne zahrnúť do reťazca.

Režimy súborov na čítanie a zápis súborov

Keď otvoríte súbor, určíte, ako sa má otvoriť - či sa má vytvoriť z nového alebo prepísať a či je to textový alebo binárny, čítať alebo písať a či k nemu chcete pripojiť. Toto sa vykonáva pomocou jedného alebo viacerých špecifikátorov režimu súborov, ktoré sú jednoduché písmená "r", "b", "w", "a" a "+" v kombinácii s ostatnými písmenami.

  • r - Otvorí súbor na čítanie. Toto zlyhá, ak súbor neexistuje alebo ho nie je možné nájsť.
  • w - Otvorí súbor ako prázdny súbor na zápis. Ak súbor existuje, jeho obsah sa zničí.
  • a - Otvorí súbor na zápis na koniec súboru (pripojí sa) bez odstránenia značky EOF pred zápisom nových údajov do súboru; takto sa vytvorí súbor ako prvý, ak neexistuje.

Pridanie znaku „+“ do režimu súborov vytvorí tri nové režimy:

  • r + - Otvorí súbor na čítanie aj zápis. (Súbor musí existovať.)
  • w + - Otvorí súbor ako prázdny súbor na čítanie aj zápis. Ak súbor existuje, jeho obsah sa zničí.
  • a + - Otvorí súbor na čítanie a pripojenie; operácia pripájania zahŕňa odstránenie značky EOF pred zapísaním nových údajov do súboru a značka EOF sa obnoví po dokončení zápisu. Najprv vytvorí súbor, ak neexistuje. Otvorí súbor na čítanie a pripojenie; operácia pripájania zahŕňa odstránenie značky EOF pred zapísaním nových údajov do súboru a značka EOF sa obnoví po dokončení zápisu. Najprv vytvorí súbor, ak neexistuje.

Kombinácie režimov súborov

Táto tabuľka zobrazuje kombinácie režimu súborov pre textové aj binárne súbory. Všeobecne platí, že čítate alebo píšete do textového súboru, ale nie obidva naraz. S binárnym súborom môžete čítať aj zapisovať do toho istého súboru. V nasledujúcej tabuľke sú uvedené možnosti jednotlivých kombinácií.

  • r text - prečítaný
  • rb + binárne - prečítané
  • r + text - čítanie, zápis
  • r + b binárne - čítanie, zápis
  • rb + binárne - čítanie, zápis
  • w text - písať, vytvárať, skrátiť
  • WB binárne - písať, vytvárať, skrátiť
  • w + text - čítať, písať, vytvárať, skrátiť
  • w + b binárne - čítať, písať, vytvárať, skrátiť
  • wb + binárne - čítať, písať, vytvárať, skrátiť
  • text - písať, vytvárať
  • ab binárne - písať, vytvárať
  • + text - čítať, písať, vytvárať
  • a + b binárne - písať, vytvárať
  • ab + binárne - písať, vytvárať

Pokiaľ iba nevytvárate súbor (použite „wb“) alebo ho iba čítate (použite „rb“), môžete sa dostať preč s použitím „w + b“.

Niektoré implementácie umožňujú aj iné písmená. Microsoftnapríklad umožňuje:

  • režim t - text
  • c - zaviazať sa
  • n - nezáväzný
  • S - optimalizácia vyrovnávacej pamäte pre postupný prístup
  • R - ukladanie do pamäte cache nesekvenčné (náhodný prístup)
  • T - dočasné
  • D - vymazať / dočasne, čo zabije súbor, keď je zatvorený.

Nie sú prenosné, preto ich používajte na vlastné nebezpečenstvo.

Príklad ukladania súborov s priamym prístupom

Hlavným dôvodom použitia binárnych súborov je flexibilita, ktorá vám umožňuje čítať alebo písať kdekoľvek v súbore. Textové súbory umožňujú len postupné čítanie alebo zápis. S prevahou lacných alebo bezplatných databáz, napr SQLite a MySQL, znižuje potrebu používať náhodný prístup k binárnym súborom. Náhodný prístup k záznamom o súboroch je však trochu staromódny, ale stále užitočný.

Preskúmanie príkladu

Predpokladajme, že príklad ukazuje pár indexu a dátového súboru, ktorý ukladá reťazce do súboru s ľubovoľným prístupom. Reťazce majú rôzne dĺžky a sú indexované podľa polohy 0, 1 atď.

Existujú dve neplatné funkcie: CreateFiles () a ShowRecord (int recnum). CreateFiles používa znakovú medzipamäť * s veľkosťou 1100 na zadržanie dočasného reťazca tvoreného formátovacím reťazcom msg nasledovaným n hviezdičkami, kde n sa pohybuje od 5 do 1004. Dva SÚBORY * sa vytvárajú pomocou wem filemódy v premenných ftindex a ftdata. Po vytvorení sa používajú na manipuláciu so súbormi. Tieto dva súbory sú

  • Index.dat
  • dáta.Dáta

Indexový súbor obsahuje 1000 záznamov typu indextype; toto je štrukturálny indextype, ktorý má dvoch členov pos (typu fpos_t) a veľkosť. Prvá časť slučky:

naplní reťazec msg takto.

a tak ďalej. Potom toto:

naplní štruktúru dĺžkou reťazca a bodom v dátovom súbore, do ktorého bude reťazec napísaný.

V tomto okamihu je možné do ich príslušných súborov zapísať štruktúru indexového súboru aj reťazec údajového súboru. Aj keď sa jedná o binárne súbory, sú napísané postupne. Teoreticky by ste mohli písať záznamy na pozíciu za súčasným koncom súboru, ale nie je to dobrá technika na použitie a pravdepodobne vôbec nie prenosná.

Poslednou časťou je zatvorenie oboch súborov. Tým sa zabezpečí, že posledná časť súboru sa zapíše na disk. Počas zapisovania do súboru veľa zápisov nejde priamo na disk, ale sú uložené v vyrovnávacích pamätiach s pevnou veľkosťou. Keď zápis zaplní vyrovnávaciu pamäť, celý obsah vyrovnávacej pamäte sa zapíše na disk.

Funkcia vyprázdnenia súboru vynúti vyprázdnenie a môžete tiež určiť stratégie vyprázdnenia súborov, ale tie sú určené pre textové súbory.

Funkcia ShowRecord

Ak chcete otestovať, či je možné získať akýkoľvek špecifikovaný záznam z dátového súboru, musíte poznať dve veci: kde začína v dátovom súbore a aký je veľký.

Toto robí indexový súbor. Funkcia ShowRecord otvára oba súbory, vyhľadáva príslušný bod (recnum * sizeof (indextype) a vyvoláva počet bajtov = sizeof (index).

SEEK_SET je konštanta, ktorá určuje, odkiaľ sa fseek vykonáva. Na tento účel sú definované ďalšie dve konštanty.

  • SEEK_CUR - vyhľadajte vzhľadom na aktuálnu pozíciu
  • SEEK_END - vyhľadajte absolútne od konca súboru
  • SEEK_SET - vyhľadajte absolútne od začiatku súboru

Môžete použiť SEEK_CUR na posunutie ukazovateľa súboru vpred podľa veľkosti (index).

Po získaní veľkosti a polohy údajov je potrebné ich načítať.

Tu použite fsetpos () kvôli typu index.pos, ktorý je fpos_t. Alternatívnym spôsobom je použitie ftell namiesto fgetpos a fsek namiesto fgetpos. Pár fseek a ftell pracujú s int, zatiaľ čo fgetpos a fsetpos používajú fpos_t.

Po prečítaní záznamu do pamäte sa pridá nulový znak \ 0, ktorý ho zmení na správny c-string. Nezabudnite na to, alebo sa vám zrúti. Rovnako ako predtým, fclose sa volá v oboch súboroch. Aj keď nestratíte žiadne dáta, ak zabudnete fclose (na rozdiel od zápisov), budete mať únik pamäte.