Poleg najpreprostejših aplikacij mora večina programov brati ali pisati datoteke. Morda gre samo za branje konfiguracijske datoteke ali razčlenjevanje besedila ali kaj bolj zapletenega. Ta vadnica se osredotoča na uporabo datotek z naključnim dostopom v C.
Programiranje V / I datoteke z naključnim dostopom na C
Osnovne operacije datotek so:
- fopen - odprite datoteko - določite, kako se odpre (branje / pisanje) in vnesite (binarni / besedilni)
- fclose - zaprite odprto datoteko
- fread - branje iz datoteke
- fwrite - napišite v datoteko
- fseek / fsetpos - premaknite kazalec datoteke nekam v datoteko
- ftell / fgetpos - pove, kje se nahaja kazalec datoteke
Dve temeljni vrsti datotek sta besedilo in binarni. Od teh dveh so dvojiške datoteke običajno preprostejše. Zaradi tega in dejstva, da naključni dostop do besedilne datoteke ni nekaj, kar morate pogosto storiti, je ta vadnica omejena na binarne datoteke. Prve štiri zgoraj naštete operacije so namenjene tako za besedilne datoteke kot za datoteke z naključnim dostopom. Zadnja dva samo za naključni dostop.
Naključni dostop pomeni, da se lahko premaknete na kateri koli del datoteke in iz nje preberete ali pišete podatke, ne da bi morali prebrati celotno datoteko. Pred leti so bili podatki shranjeni na velikih kolutih računalniškega traku. Edini način, da pridemo do točke na traku, je bil branje skozi celoten trak. Nato so prišli diski in zdaj lahko neposredno preberete kateri koli del datoteke.
Programiranje z binarnimi datotekami
Binarna datoteka je datoteka katere koli dolžine, ki vsebuje bajte z vrednostmi v območju od 0 do 255. Ti bajti nimajo drugega pomena za razliko od besedilne datoteke, kjer vrednost 13 pomeni vrnitev nosilca, 10 pomeni podatek vrstice in 26 pomeni konec datoteke. Programska oprema za branje besedilnih datotek se mora spoprijeti s temi drugimi pomeni.
Binarne datoteke so tok bajtov in sodobni jeziki ponavadi delujejo s tokovi in ne z datotekami. Pomemben del je tok podatkov in ne od kod prihaja. V C, o podatkih lahko razmišljate kot o datotekah ali tokovih. Z naključnim dostopom lahko berete ali pišete v kateri koli del datoteke ali toka. S zaporednim dostopom se morate od začetka vrteti skozi datoteko ali pretakati kot velik trak.
Ta vzorec kode prikazuje preprosto binarno datoteko, ki se odpre za pisanje, v njej pa je vpisan besedilni niz (char *). Običajno to vidite z besedilno datoteko, lahko pa besedilo napišete v dvojiško datoteko.
Ta primer odpre dvojiško datoteko za pisanje in nato vanj zapiše char * (niz). Spremenljivka FILE * se vrne iz klica fopen (). Če to ne uspe (datoteka lahko obstaja in je odprta ali samo za branje ali je lahko prišlo do napake z imenom datoteke), potem vrne 0.
Ukaz fopen () poskuša odpreti določeno datoteko. V tem primeru je test.txt v isti mapi kot aplikacija. Če datoteka vključuje pot, potem je treba vse poševne črte podvojiti. "c: \ mapa \ test.txt" ni pravilna; morate uporabiti "c: \\ mapo \\ test.txt".
Ker je način datoteke "wb", se ta koda zapiše v dvojiško datoteko. Datoteka je ustvarjena, če ne obstaja, in če je, se vse, kar je v njej, izbriše. Če klic klančenja ne uspe, morda zato, ker je bila datoteka odprta ali ime vsebuje neveljavne znake ali neveljavno pot, fopen vrne vrednost 0.
Čeprav lahko samo preverite, ali je ft enaka nič (uspeh), ima ta primer funkcija FileSuccess (), da to izrecno naredi. V operacijskem sistemu Windows odda klic in ime datoteke za uspeh / neuspeh. Če ste po nastopu, je malce težaven, zato lahko to omejite na odpravljanje napak. V operacijskem sistemu Windows je malo sistemskega odpravljanja besedila na stroju.
Fwrite () kliče odda določeno besedilo. Drugi in tretji parameter sta velikost znakov in dolžina niza. Oba sta definirana kot velikost_t, ki ni podpisano celo število. Rezultat tega klica je pisanje štetkov predmetov določene velikosti. Upoštevajte, da z binarnimi datotekami, čeprav pišete niz (char *), ne doda nobenih znakov vrnitve ali vnosa vrstic. Če jih želite, jih morate izrecno vključiti v niz.
Načini datotek za branje in pisanje datotek
Ko odprete datoteko, določite, kako jo je treba odpreti - ali jo želite ustvariti iz nove ali jo prepisati in ali je besedilo ali dvojiško besedilo, branje ali pisanje in če ga želite priložiti. To se naredi z uporabo enega ali več specifikatorjev datotečnega načina, ki so enostavne črke "r", "b", "w", "a" in "+" v kombinaciji z drugimi črkami.
- r - odpre datoteko za branje. To ne uspe, če datoteka ne obstaja ali je ni mogoče najti.
- w - Odpre datoteko kot prazno datoteko za pisanje. Če datoteka obstaja, se njena vsebina uniči.
- a - odpre datoteko za pisanje na koncu datoteke (priloga), ne da bi odstranil oznako EOF, preden v datoteko napiše nove podatke; to ustvari datoteko najprej, če ne obstaja.
Če dodate »+« v datotečni način, ustvarite tri nove načine:
- r + - Odpre datoteko za branje in pisanje. (Datoteka mora obstajati.)
- w + - odpre datoteko kot prazno datoteko za branje in pisanje. Če datoteka obstaja, se njena vsebina uniči.
- a + - odpre datoteko za branje in dodajanje; operacija dodajanja vključuje odstranitev označevalnika EOF, preden se v datoteko zapišejo novi podatki, in označevalec EOF se obnovi po končanem pisanju. Datoteko ustvari najprej, če ne obstaja. Odpre datoteko za branje in dodajanje; operacija dodajanja vključuje odstranitev označevalnika EOF, preden se v datoteko zapišejo novi podatki, in označevalec EOF se obnovi po končanem pisanju. Datoteko ustvari najprej, če ne obstaja.
Kombinacije datotečnega načina
Ta tabela prikazuje kombinacije datotek za besedilne in dvojiške datoteke. Na splošno bodisi berete ali pišete v besedilno datoteko, vendar ne hkrati hkrati. Z binarno datoteko lahko berete in pišete v isto datoteko. Spodnja tabela prikazuje, kaj lahko naredite z vsako kombinacijo.
- r besedilo - preberi
- rb + binarno - branje
- r + besedilo - branje, pisanje
- r + b binarno - branje, pisanje
- rb + binarno - branje, pisanje
- w besedilo - napišite, ustvarite, okrnite
- wb binary - piši, ustvarjaj, okrni
- w + besedilo - branje, pisanje, ustvarjanje, krajšanje
- w + b binarno - branje, pisanje, ustvarjanje, prerezati
- wb + binary - branje, pisanje, ustvarjanje, prerezati
- besedilo - napišite, ustvarite
- ab binary - piši, ustvarjaj
- a + besedilo - branje, pisanje, ustvarjanje
- b + binarno - piši, ustvarjaj
- ab + binarni - piši, ustvarjaj
Če samo ustvarite datoteko (uporabite "wb") ali samo preberete eno (uporabite "rb"), se lahko zbežate z uporabo "w + b".
Nekatere izvedbe omogočajo tudi druge črke. Microsoftna primer omogoča:
- t - besedilni način
- c - zavezati se
- n - brez obveznosti
- S - optimizacija predpomnilnika za zaporedni dostop
- R - nesekvenčno predpomnjenje (naključni dostop)
- T - začasno
- D - brisanje / začasno, ki datoteko ubije, ko je zaprta.
Te niso prenosne, zato jih uporabite na lastno odgovornost.
Primer shranjevanja datotek z naključnim dostopom
Glavni razlog za uporabo binarnih datotek je prilagodljivost, ki omogoča branje ali pisanje kjer koli v datoteki. Besedilne datoteke omogočajo samo branje ali pisanje zaporedno. S razširjenostjo poceni ali brezplačnih baz podatkov, kot so SQLite in MySQL, zmanjšuje potrebo po uporabi naključnega dostopa do binarnih datotek. Vendar je naključni dostop do zapisov datotek nekoliko staromoden, vendar še vedno uporaben.
Preučitev primera
Predpostavimo, da prikazuje primer indeksnih in podatkovnih parov, ki shranjujejo nizov v datoteko z naključnim dostopom. Strune so različnih dolžin in so indeksirane s položajem 0, 1 in tako naprej.
Obstajata dve neveljavni funkciji: CreateFiles () in ShowRecord (int recnum). CreateFiles uporablja pomnilnik char * velikosti 1100 za shranjevanje začasnega niza, sestavljenega iz niza formata msg, ki mu sledi n zvezdic, kjer se n razlikuje od 5 do 1004. Dva FILE * sta ustvarjena z uporabo wb filemode v spremenljivkah ftindex in ftdata. Po ustvarjanju se te uporabljajo za upravljanje datotek. Dve datoteki sta
- indeks.dat
- data.dat
Indeksna datoteka vsebuje 1000 zapisov vrste indextype; to je strukturni indekstip, ki ima dva člana pos (tipa fpos_t) in velikost. Prvi del zanke:
populi niz msg, kot je ta.
in tako naprej. Potem še tole:
populi strukturo z dolžino niza in točko v podatkovni datoteki, kamor bo zapisan niz.
Na tej točki lahko v datoteko zapišete tako datoteko indeksnih datotek kot niz podatkovne datoteke. Čeprav gre za binarne datoteke, se pišejo zaporedno. Teoretično bi lahko zapisali zapise na položaj, ki presega trenutni konec datoteke, vendar to ni dobra tehnika uporabe in verjetno sploh ni prenosljiva.
Končni del je zapiranje obeh datotek. To zagotavlja, da se zadnji del datoteke zapiše na disk. Med pisanjem datotek veliko zapisov ne gre neposredno na disk, ampak se hranijo v medpomnilnikih velikosti določene velikosti. Po pisanju napolni odbojnik, se celotna vsebina medpomnilnika zapiše na disk.
Funkcija izpiranja datotek sili rdečico in določite lahko tudi strategije izpiranja datotek, vendar so te namenjene besedilnim datotekam.
Funkcija ShowRecord
Če želite preveriti, ali je mogoče najti vsak zapis iz podatkovne datoteke, morate vedeti dve stvari: kje se začne v podatkovni datoteki in kako velik je.
To počne indeksna datoteka. Funkcija ShowRecord odpre obe datoteki, išče ustrezno točko (recnum * sizeof (indextype) in pridobi veliko bajtov = sizeof (indeks).
SEEK_SET je stalnica, ki določa, od kod se izvaja fseek. Za to sta določeni dve drugi konstanti.
- SEEK_CUR - poiščite glede na trenutni položaj
- SEEK_END - poiščite absolut od konca datoteke
- SEEK_SET - poiščite absolut od začetka datoteke
Lahko uporabite SEEK_CUR za premikanje kazalca datoteke naprej po velikosti (indeksu).
Ko dobimo velikost in položaj podatkov, ostane le, da jih pridobimo.
Tu uporabite fsetpos () zaradi vrste index.pos, ki je fpos_t. Drugi način je uporaba ftell namesto fgetpos in fsek namesto fgetpos. Par fseek in ftell delujeta z int, medtem ko fgetpos in fsetpos uporabljata fpos_t.
Po branju zapisa v pomnilnik se doda ničlen znak \ 0, da ga spremeni v pravilno c-string. Ne pozabite, ali se boste zrušili. Tako kot doslej je fclose v obeh datotekah pozvan. Čeprav ne boste izgubili nobenih podatkov, če pozabite fclose (za razliko od zapisov), se vam bo sprožil spomin.