C programavimo pamoka apie atsitiktinės prieigos failų tvarkymą

Be paprasčiausių programų, dauguma programų turi skaityti ar rašyti failus. Tai gali būti tik konfigūracijos failo skaitymas, teksto analizatorius ar kažkas sudėtingesnio. Šiame vadove pagrindinis dėmesys skiriamas laisvosios kreipties failų naudojimui C.

Programavimas Random Access File I / O C

dvejetainis failas
„D3Damon“ / „Getty Images“

Pagrindinės failų operacijos yra šios:

  • fopen - atidarykite failą - nurodykite, kaip jis atidaromas (skaitykite / rašykite) ir įveskite (dvejetainis / tekstas)
  • „fclose“ - uždarykite atidarytą failą
  • fread - skaityti iš failo
  • fwrite - rašyti į failą
  • fseek / fsetpos - perkelkite failo žymiklį į kažkokį failą
  • ftell / fgetpos - nurodys, kur yra failo žymiklis

Du pagrindiniai failų tipai yra tekstas ir dvejetainis. Iš šių dviejų dvejetainius failus paprastai tvarkyti paprasčiau. Dėl šios priežasties ir dėl to, kad atsitiktinė prieiga prie teksto failo nėra kažkas, ką jums reikia dažnai daryti, ši instrukcija apsiriboja dvejetainiais failais. Pirmiau išvardytos keturios operacijos yra susijusios ir su teksto, ir su laisvosios kreipties failais. Paskutiniai du tik atsitiktinės prieigos dėka.

instagram viewer

Atsitiktinė prieiga reiškia, kad galite pereiti į bet kurią failo dalį ir skaityti ar rašyti duomenis iš jos, neperskaitę viso failo. Prieš daugelį metų duomenys buvo saugomi didelėse kompiuterio juostų ritėse. Vienintelis būdas pasiekti juostos tašką buvo perskaityti visą juostą. Tada atsirado diskai ir dabar galite tiesiogiai skaityti bet kurią failo dalį.

Programavimas naudojant dvejetainius failus

Dvejetainis failas yra bet kokio ilgio failas, turintis baitus, kurių vertės yra nuo 0 iki 255. Šie baitai neturi jokios kitos reikšmės, skirtingai nei tekstiniame faile, kur 13 reikšmė reiškia vežimo grįžimą, 10 reiškia eilutės tiekimą ir 26 reiškia failo pabaigą. Programinė įranga, skaitanti tekstinius failus, turi atsižvelgti į šias kitas reikšmes.

Dvejetainiai failai yra baitų srautas, o šiuolaikinės kalbos yra linkusios dirbti su srautais, o ne su failais. Svarbi dalis yra duomenų srautas, o ne iš kur jis atsirado. Į C, galite galvoti apie duomenis kaip failus ar srautus. Turėdami atsitiktinę prieigą, galite skaityti arba rašyti į bet kurią failo ar srauto dalį. Turėdami nuoseklią prieigą, turite iš pradžių peržiūrėti failą ar srautą kaip didelę juostą.

Šis kodo pavyzdys rodo paprastą dvejetainį failą, kuris atidaromas rašyti, į jį įrašant teksto eilutę (char *). Paprastai tai matote su tekstiniu failu, tačiau tekstą galite rašyti į dvejetainį failą.

Šis pavyzdys atidaro dvejetainį failą, skirtą rašyti, ir tada į jį įveda char * (eilutę). FILE * kintamasis grąžinamas iš fopen () skambučio. Jei tai nepavyksta (failas gali būti ir gali būti atidarytas arba tik skaitomas arba gali būti failo vardo gedimas), tada grąžinama 0.

Komanda fopen () bando atidaryti nurodytą failą. Tokiu atveju tai yra test.txt tame pačiame aplanke kaip ir programa. Jei faile yra kelias, tada visi pasvirieji brūkšniai turi būti dvigubai padidinti. „c: \ folder \ test.txt“ yra neteisingas; turite naudoti „c: \\ aplanką \\ test.txt“.

Kadangi failo režimas yra „wb“, šis kodas rašomas į dvejetainį failą. Failas sukuriamas, jei jo nėra, o jei jis yra, viskas, kas jame buvo, bus ištrinta. Jei nepavyksta iškviesti fopeno, galbūt todėl, kad failas buvo atidarytas arba pavadinime yra neteisingi simboliai arba neteisingas kelias, fopen pateikia 0 vertę.

Nors jūs galite tiesiog patikrinti, ar pėdos nėra nulinės (sėkmė), šiame pavyzdyje yra FileSuccess () funkcija, kad tai aiškiai atliktumėte. „Windows“ sistemoje jis pateikia skambučio sėkmę / nesėkmę ir failo vardą. Tai šiek tiek apsunkina, jei esate po atlikimo, todėl galite apsiriboti derinimo funkcija. „Windows“ sistemoje yra nedaug pridėtinių tekstų, išvedančių į sistemos derintuvą.

Fwrite () skambučiai išveda nurodytą tekstą. Antrasis ir trečiasis parametrai yra simbolių dydis ir eilutės ilgis. Abu yra apibrėžti kaip dydis_t, kuris yra nepasirašytas sveikasis skaičius. Šio skambučio rezultatas - parašyti nurodyto dydžio elementai. Atminkite, kad naudojant dvejetainius failus, net jei rašote eilutę (char *), ji neprideda jokių vežimo grąžinimo ar eilučių ženklų. Jei norite tokių, turite juos aiškiai įtraukti į eilutę.

Failų režimai failams skaityti ir rašyti

Kai atidarote failą, nurodote, kaip jis turi būti atidarytas - ar jį sukurti iš naujo, ar neperrašyti, ar tai tekstinis, ar dvejetainis, skaityti ar rašyti ir jei norite jį pridėti. Tai atliekama naudojant vieną ar kelis failų režimo parametrus, kurie yra viena raidė „r“, „b“, „w“, „a“ ir „+“ kartu su kitomis raidėmis.

  • r - atidaro failą skaitymui. Tai nepavyksta, jei failo nėra arba jo negalima rasti.
  • w - atidaro failą kaip tuščią failą rašyti. Jei failas egzistuoja, jo turinys sunaikinamas.
  • a - atidaro failą rašymui failo pabaigoje (pridedama), nepašalinant EOF žymeklio, prieš įrašant į failą naujus duomenis; tai pirmiausia sukuria failą, jei jo nėra.

Pridėjus „+“ prie failų režimo, sukuriami trys nauji režimai:

  • r + - atidaro failą tiek skaitymui, tiek rašymui. (Failas turi egzistuoti.)
  • w + - atidaro failą kaip tuščią failą, kurį galima skaityti ir rašyti. Jei failas egzistuoja, jo turinys sunaikinamas.
  • a + - atidaro failą skaityti ir pridėti; pridedama operacija apima EOF žymeklio pašalinimą prieš įrašant naujus duomenis į failą, o EOF žymeklis atstatomas užbaigus rašymą. Pirmiausia jis sukuria failą, jei jo nėra. Atidaro failą skaityti ir pridėti; pridedama operacija apima EOF žymeklio pašalinimą prieš įrašant naujus duomenis į failą, o EOF žymeklis atstatomas užbaigus rašymą. Pirmiausia jis sukuria failą, jei jo nėra.

Failų režimo deriniai

Šioje lentelėje pateikiami teksto ir dvejetainių failų failų režimo deriniai. Paprastai jūs skaitote arba rašote į tekstinį failą, bet ne abu tuo pačiu metu. Naudodami dvejetainį failą, galite skaityti ir rašyti tame pačiame faile. Žemiau esančioje lentelėje parodyta, ką galite padaryti su kiekvienu deriniu.

  • r tekstas - skaityti
  • rb + dvejetainis - skaityti
  • r + tekstas - skaityti, rašyti
  • r + b dvejetainis - skaityti, rašyti
  • rb + dvejetainis - skaityti, rašyti
  • w tekstas - rašyti, kurti, sutrumpinti
  • wb dvejetainis - rašyti, kurti, kirpti
  • w + tekstas - skaityti, rašyti, kurti, kirpti
  • w + b dvejetainiai - skaityti, rašyti, kurti, kirpti
  • wb + dvejetainis - skaityti, rašyti, kurti, kirpti
  • tekstas - rašyti, kurti
  • ab dvejetainis - rašyti, kurti
  • + tekstas - skaityti, rašyti, kurti
  • a + b dvejetainis - rašyti, kurti
  • ab + dvejetainis - rašyti, kurti

Nebent kuriate failą (naudokite „wb“) arba tik jį skaitote (naudokite „rb“), galite atsikratyti naudodami „w + b“.

Kai kurie diegimai leidžia naudoti ir kitas raides. „Microsoft“, pavyzdžiui, leidžia:

  • t - teksto režimas
  • c - įsipareigoti
  • n - neįsipareigoti
  • S - talpyklos optimizavimas nuosekliajai prieigai
  • R - talpyklos kaupimas nenuosekliai (atsitiktinė prieiga)
  • T - laikina
  • D - ištrinti / laikinai panaikinti failą, kai jis uždaromas.

Jie nėra nešiojami, todėl naudokite juos sau.

Atsitiktinės prieigos failų saugojimo pavyzdys

Pagrindinė dvejetainių failų naudojimo priežastis yra lankstumas, leidžiantis skaityti ar rašyti bet kurioje failo vietoje. Tekstiniai failai leidžia tik skaityti ar rašyti paeiliui. Paplitusi nebrangios ar nemokamos duomenų bazės, tokios kaip SQLite ir „MySQL“, sumažina poreikį naudoti atsitiktinę prieigą dvejetainiuose failuose. Vis dėlto atsitiktinė prieiga prie failų įrašų yra šiek tiek pasenusi, tačiau vis tiek naudinga.

Nagrinėjant pavyzdį

Tarkime, kad rodyklė ir duomenų failų pora saugo eilutes laisvosios kreipties faile. Stygos yra skirtingo ilgio ir yra indeksuojamos pagal padėtį 0, 1 ir pan.

Yra dvi negaliojančios funkcijos: „CreateFiles“ () ir „ShowRecord“ (int recnum). „CreateFiles“ naudoja 1100 dydžio „char *“ buferį, kad laikytų laikiną eilutę, sudarytą iš formato eilutės pranešimo, po kurio eina n žvaigždutės, kur n skiriasi nuo 5 iki 1004. Du failai * sukuriami naudojant wb filemode kintamuosiuose ftindex ir ftdata. Po sukūrimo jie naudojami manipuliuoti failais. Šios dvi bylos yra

  • rodyklė.dat
  • duomenys.dat

Rodyklės faile yra 1000 įrašų apie tipo indeksą; tai yra struktūrinis indekso tipas, turintis du elementus pos (tipo fpos_t) ir dydį. Pirma kilpos dalis:

užpildo eilutės pranešimą taip.

ir taip toliau. Tada tai:

užpildo struktūrą su eilutės ilgiu ir tašku duomenų faile, kuriame eilutė bus parašyta.

Šiuo metu tiek indekso failo struktūrą, tiek duomenų failo eilutę galima įrašyti į atitinkamus failus. Nors tai yra dvejetainiai failai, jie rašomi paeiliui. Teoriškai įrašus galėtumėte įrašyti į vietą, esančią už dabartinės bylos pabaigos, bet tai nėra gera technika ir tikriausiai visai nekeliama.

Paskutinė dalis yra uždaryti abu failus. Tai užtikrina, kad paskutinė failo dalis būtų įrašyta į diską. Failų rašymo metu daugelis rašomų įrašų nekeliauja tiesiai į diską, bet laikomi fiksuoto dydžio buferiuose. Po to, kai rašymas užpildo buferį, visas buferio turinys įrašomas į diską.

Failų prapylimo funkcija verčia ištuštinti ir jūs taip pat galite nurodyti failų plovimo strategijas, tačiau jos yra skirtos tekstiniams failams.

„ShowRecord“ funkcija

Norėdami patikrinti, ar galima atkurti bet kurį nurodytą įrašą iš duomenų failo, turite žinoti du dalykus: kur jis prasideda duomenų faile ir kiek jis yra didelis.

Tai daro indekso failas. Funkcija „ShowRecord“ atidaro abu failus, ieško atitinkamo taško (recnum * sizeof (indextype)) ir atkelia baitų skaičių = sizeof (index).

SEEK_SET yra konstanta, nurodanti, iš kur atliekamas fseek. Tam yra apibrėžtos dar dvi konstantos.

  • SEEK_CUR - ieškokite pagal esamą padėtį
  • SEEK_END - ieškokite absoliučios nuo bylos pabaigos
  • SEEK_SET - ieškokite absoliutaus nuo bylos pradžios

Galite naudoti SEEK_CUR norėdami perkelti failo žymiklį į priekį pagal dydį (rodyklę).

Gavus duomenų dydį ir vietą, belieka juos surinkti.

Naudokite fsetpos (), nes yra index.pos tipas, kuris yra fpos_t. Alternatyvus būdas yra naudoti ftell vietoj fgetpos ir fsek vietoj fgetpos. Pora fseek ir ftell dirba su int, tuo tarpu fgetpos ir fsetpos naudoja fpos_t.

Perskaičius įrašą atmintyje, pridedamas nulis simbolis \ 0, kad jis būtų paverstas tinkamu c-styga. Nepamirškite to, nes kitaip įvyks avarija. Kaip ir anksčiau, abu failai yra vadinami „fclose“. Nors neprarasite jokių duomenų, jei pamiršite uždaryti informaciją (skirtingai nei rašo), turėsite atminties nutekėjimą.