Lisaks kõige lihtsamatele rakendustele peab enamik programme faile lugema või kirjutama. See võib olla mõeldud lihtsalt konfiguratsioonifaili lugemiseks, tekstiredaktoriks või muuks keerukamaks. See õpetus keskendub C-s juhusliku juurdepääsuga failide kasutamisele.
Juhusliku juurdepääsu faili I / O programmeerimine C-vormingus
Põhifailide toimingud on järgmised:
- fopen - faili avamine - täpsustage, kuidas see avatakse (lugege / kirjutage) ja tüüp (binaarne / tekst)
- fclose - sulgege avatud fail
- fread - failist lugemine
- fwrite - faili kirjutamine
- fseek / fsetpos - viige kursor faili mõnda kohta
- ftell / fgetpos - ütleb teile, kus failide osuti asub
Kaks peamist failitüüpi on tekst ja binaarne. Neist kahest on binaarfailidega töötlemine tavaliselt lihtsam. Sel põhjusel ja kuna tekstifaili juhuslik juurdepääs pole sageli midagi sellist, mida peate tegema, piirdub see õpetus binaarfailidega. Esimesed neli ülaltoodud toimingut on tehtud nii teksti- kui ka vabapääsufailide jaoks. Kaks viimast lihtsalt juhusliku juurdepääsu jaoks.
Juhuslik juurdepääs tähendab, et saate liikuda faili suvalisse ossa ja sealt andmeid lugeda või kirjutada, ilma et peaksite kogu faili läbi lugema. Aastaid tagasi salvestati andmeid arvutilindi suurtele rullidele. Ainus viis lindil asuvasse punkti jõuda oli kogu teibi läbi lugemine. Siis tulid kettad kaasa ja nüüd saate faili mis tahes osa otse lugeda.
Programmeerimine binaarfailidega
Binaarfail on mis tahes pikkusega fail, milles on bait väärtustega vahemikus 0 kuni 255. Neil baitidel pole teistsugust tähendust, erinevalt tekstifailist, kus väärtus 13 tähendab vedu tagasitulekut, 10 tähendab rea voogu ja 26 tähendab faili lõppu. Tekstifaile lugev tarkvara peab käsitlema neid teisi tähendusi.
Binaarfailid voogude baitides ja kaasaegsed keeled töötavad pigem voogude kui failide asemel. Oluline osa on andmevoog, mitte selle päritolu. Sisse C, võite mõelda andmetele kas failide või voogudena. Juhusliku juurdepääsu korral saate faili või voo ükskõik millist osa lugeda või sinna kirjutada. Järjestikuse juurdepääsu korral peate faili või voogu algusest peale ümber lükkama nagu suurt linti.
See koodinäide näitab kirjutamiseks avatavat lihtsat binaarfaili, millesse kirjutatakse tekstistring (char *). Tavaliselt näete seda koos tekstifailiga, kuid võite teksti kirjutada kahendfaili.
See näide avab binaarfaili kirjutamiseks ja kirjutab sinna char * (stringi). Muutuja FILE * naaseb fopen () kõnest. Kui see ei õnnestu (fail võib olla olemas ja olla avatud või kirjutuskaitstud või võib failinimes olla tõrge), tagastab see 0.
Käsk fopen () proovib määratud faili avada. Sel juhul on see test.txt rakendusega samas kaustas. Kui fail sisaldab teed, siis tuleb kõik kaldkriipsud kahekordistada. "c: \ kaust \ test.txt" on vale; peate kasutama "c: \\ kaust \\ test.txt".
Kuna failirežiim on "wb", kirjutab see kood binaarfaili. Fail luuakse, kui seda pole olemas, ja kui see on olemas, siis kustutatakse kõik, mis selles oli. Kui fopeni üleskutse ebaõnnestub, näiteks seetõttu, et fail oli avatud või nimi sisaldab kehtetuid märke või valet teed, tagastab fopen väärtuse 0.
Ehkki võite lihtsalt kontrollida, kas jalgade arv pole null (edu), on sellel näitel funktsioon FileSuccess (), et seda otsesõnu teha. Windowsis väljastab see kõne õnnestumise / ebaõnnestumise ja failinime. See on pisut koormav, kui olete pärast esinemist, nii et võite piirduda silumisega. Windowsis on süsteemi silurile teksti ülivähe väljund.
Fwrite () kutsub välja määratud teksti. Teine ja kolmas parameeter on märkide suurus ja stringi pikkus. Mõlemad on määratletud kui suurus_t, mis on allkirjastamata täisarv. Selle kõne tulemusel kirjutatakse kindlaksmääratud suurusega üksusi. Pidage meeles, et kahendfailide korral, kuigi kirjutate stringi (char *), ei lisa see mingeid vedu tagastamise ega reavahetuse märke. Kui soovite neid, peate need sõnaselgelt stringi lisama.
Failide režiimid failide lugemiseks ja kirjutamiseks
Faili avamisel täpsustate, kuidas see avada - kas luua see uuest või üle kirjutada ja kas see on tekst või binaarne, loe või kirjuta ja kas soovite selle lisada. Selleks kasutatakse ühte või mitut failirežiimi täpsustajat, mis on koos teiste tähtedega tähed "r", "b", "w", "a" ja "+".
- r - avab faili lugemiseks. See ebaõnnestub, kui faili pole või seda ei leita.
- w - avab faili kirjutamiseks tühja failina. Kui fail on olemas, hävitatakse selle sisu.
- a - avab faili kirjutamiseks faili lõpus (lisatud) ilma EOF-i markerit eemaldamata enne faili uute andmete kirjutamist; see loob faili kõigepealt, kui seda pole olemas.
Kui lisate failirežiimi "+", luuakse kolm uut režiimi:
- r + - avab faili nii lugemiseks kui ka kirjutamiseks. (Fail peab olema olemas.)
- w + - avab faili tühjana failina nii lugemiseks kui ka kirjutamiseks. Kui fail on olemas, hävitatakse selle sisu.
- a + - avab faili lugemiseks ja lisamiseks; lisatud toiming hõlmab EOF-i markeri eemaldamist enne, kui faili kirjutatakse uued andmed, ja EOF-i marker taastatakse pärast kirjutamise lõpetamist. Esmalt loob faili, kui seda pole olemas. Avab faili lugemiseks ja lisamiseks; lisatud toiming hõlmab EOF-i markeri eemaldamist enne, kui faili kirjutatakse uued andmed, ja EOF-i marker taastatakse pärast kirjutamise lõpetamist. Esmalt loob faili, kui seda pole olemas.
Failirežiimi kombinatsioonid
See tabel näitab failirežiimi kombinatsioone nii teksti- kui ka kahendfailide jaoks. Üldiselt loete või kirjutate tekstifailist, kuid mitte mõlemat korraga. Binaarfaili korral saate nii faili lugeda kui ka kirjutada. Allolev tabel näitab, mida saate iga kombinatsiooniga teha.
- r tekst - loe
- rb + binaarne - loe
- r + tekst - lugege, kirjutage
- r + b binaarne - lugege, kirjutage
- rb + binaarne - lugege, kirjutage
- w tekst - kirjutage, looge, kärbige
- wb binaarne - kirjuta, loo, kärbi
- w + tekst - lugege, kirjutage, looge, kärbige
- w + b binaarne - lugege, kirjutage, looge, kärbige
- wb + binaarne - lugege, kirjutage, looge, kärbige
- tekst - kirjuta, loo
- ab binaarne - kirjuta, loo
- + tekst - lugege, kirjutage, looge
- a + b binaarne - kirjutage, looge
- ab + binaarne - kirjutage, looge
Kui loote vaid faili (kasutage "wb") või loete ainult seda (kasutage "rb"), võite sellest lahti saada, kasutades "w + b".
Mõned rakendused lubavad ka teisi tähti. Microsoftnäiteks lubab:
- t - tekstirežiim
- c - pühenduma
- n - mittekohustuslik
- S - vahemälu optimeerimine järjestikuse juurdepääsu jaoks
- R - vahemällu salvestamata jätmine (juhuslik juurdepääs)
- T - ajutine
- D - kustuta / ajutine, mis tapab faili, kui see on suletud.
Need pole kaasaskantavad, nii et kasutage neid ise.
Juhusliku juurdepääsuga failide säilitamise näide
Binaarfailide kasutamise peamine põhjus on paindlikkus, mis võimaldab teil faili ükskõik kuhu lugeda või kirjutada. Tekstifailid võimaldavad teil ainult järjestikku lugeda või kirjutada. Levinud on odavate või tasuta andmebaaside, näiteks SQLite ja MySQL, vähendab vajadust kasutada juhuslikku juurdepääsu binaarfailidele. Juhuslik juurdepääs failide kirjetele on siiski veidi vanamoodne, kuid siiski kasulik.
Näite uurimine
Oletame, et näites on indeks- ja andmefailide paar, mis salvestab stringe suvalise juurdepääsuga failis. Stringid on erineva pikkusega ja neid indekseeritakse positsioonidega 0, 1 ja nii edasi.
Seal on kaks tühist funktsiooni: CreateFiles () ja ShowRecord (int recnum). CreateFiles kasutab formaadis stringi sõnumist koosneva ajutise stringi hoidmiseks char * puhvrit suurusega 1100, millele järgneb n tärn, kus n varieerub vahemikus 5 kuni 1004. Kaks faili * luuakse mõlemad, kasutades muutujates ftindex ja ftdata wb filemode. Pärast loomist kasutatakse neid failidega manipuleerimiseks. Need kaks faili on
- register.dat
- andmed.dat
Indeksifailis on 1000 kirjetüübi tüüpi kirjet; see on struktuuri indeksitüüp, millel on kaks liiget pos (tüüp fpos_t) ja suurus. Silmuse esimene osa:
täidab stringi msg niimoodi.
ja nii edasi. Siis see:
populatsioonib stringi pikkuse ja selle punktiga andmefailis, kuhu string kirjutatakse.
Sel hetkel saab nii indeksfaili struktuuri kui ka andmefaili stringi kirjutada vastavatesse failidesse. Kuigi need on kahendfailid, kirjutatakse need järjestikku. Teoreetiliselt võiks kirjutada kirjeid faili praegusest lõpust kaugemale, kuid see pole hea tehnika kasutamiseks ja tõenäoliselt pole see üldse teisaldatav.
Viimane osa on mõlema faili sulgemine. See tagab faili viimase osa kirjutamise kettale. Failide kirjutamise ajal ei lähe paljud kirjutamised otse kettale, vaid neid hoitakse kindla suurusega puhvrites. Pärast seda, kui kirjutus täidab puhvri, kirjutatakse kogu puhver sisu kettale.
Faili loputamisfunktsioon sunnib loputamist ja saate ka täpsustada failide loputamise strateegiaid, kuid need on mõeldud tekstifailide jaoks.
ShowRecord funktsioon
Et testida, kas suvalist andmefaili täpsustatud kirjet on võimalik hankida, peate teadma kahte asja: kust see andmefailis algab ja kui suur see on.
Seda teeb indeksfail. Funktsioon ShowRecord avab mõlemad failid, otsib sobivat punkti (recnum * sizeof (indextype) ja tõmbab mitu baiti = sizeof (index).
SEEK_SET on konstant, mis täpsustab, kust fseek tehakse. Selle jaoks on määratletud veel kaks konstanti.
- SEEK_CUR - otsige praeguse asukoha suhtes
- SEEK_END - otsige faili lõpust absoluutset
- SEEK_SET - otsige faili algusest absoluutset
Faili kursori liigutamiseks suuruse (indeksi) võrra võiksite kasutada faili SEEK_CUR.
Pärast andmete suuruse ja asukoha saamist jääb üle vaid nende toomine.
Kasutage siin fsetpos (), kuna tüüpi index.pos on fpos_t. Alternatiivne viis on kasutada fgetpos asemel ftell ja fsek asemel fsek. Paar fseek ja ftell töötavad int-iga, fgetpos ja fsetpos aga fpos_t.
Pärast kirje mällu lugemist lisatakse nullimärk \ 0, et muuta see õigeks c-string. Ärge unustage seda, vastasel juhul saate krahhi. Nagu varem, kutsutakse mõlemas failis faili fclose. Kuigi te ei kaota andmeid, kui unustate sulgemise (erinevalt kirjutistest), on teil mälu leke.