Osim najjednostavnijih aplikacija, većina programa mora čitati ili pisati datoteke. To može biti samo za čitanje konfiguracijske datoteke ili analize teksta ili nešto sofisticiranije. Ovaj se udžbenik usredotočuje na korištenje datoteka sa slučajnim pristupom u C.
Programiranje I / O datoteke slučajnog pristupa u C

Osnovne radnje datoteka su:
- fopen - otvorite datoteku - odredite kako je otvorena (čitanje / pisanje) i unesite (binarni / tekst)
- fclose - zatvori otvorenu datoteku
- fread - čitanje iz datoteke
- fwrite - pisati u datoteku
- fseek / fsetpos - pomaknite pokazivač datoteke na neko mjesto u datoteci
- ftell / fgetpos - kažem vam gdje se nalazi pokazivač datoteke
Dvije osnovne vrste datoteka su tekst i binarni. Od ove dvije, binarne datoteke se obično rješavaju. Iz tog razloga i činjenice da slučajni pristup tekstualnoj datoteci nije nešto što trebate učiniti često, ovaj je vodič ograničen na binarne datoteke. Prve četiri gore navedene operacije odnose se i na tekstualne i na slučajne datoteke. Posljednja dva samo za slučajni pristup.
Nasumičnim pristupom znači da se možete premjestiti u bilo koji dio datoteke i čitati ili pisati podatke iz nje bez potrebe za čitanjem kroz cijelu datoteku. Prije mnogo godina podaci su bili pohranjeni na velikim kolutima računalnih vrpci. Jedini način da se dođe do točke na vrpci bilo je čitanje cijelog traka. Zatim su se pojavili diskovi i sada možete izravno pročitati bilo koji dio datoteke.
Programiranje s binarnim datotekama
Binarna datoteka je datoteka bilo koje duljine koja sadrži bajte sa vrijednostima u rasponu od 0 do 255. Ti bajti nemaju drugo značenje za razliku od tekstualne datoteke gdje vrijednost 13 znači povratak nosača, 10 znači dovod linije i 26 znači kraj datoteke. Softver koji čita tekstualne datoteke mora se nositi s tim drugim značenjima.
Binarne datoteke tok bajtova, a suvremeni jezici teže rade s strujanjima, a ne s datotekama. Važan dio je protok podataka, a ne odakle dolazi. U C, možete razmišljati o podacima ili kao datoteke ili streamovi. Sa slučajnim pristupom, možete čitati ili pisati u bilo koji dio datoteke ili struje. Uz uzastopni pristup, od početka se morate kretati kroz datoteku ili strujati poput velike vrpce.
Ovaj uzorak koda prikazuje jednostavnu binarnu datoteku koja se otvara za pisanje, a u nju je upisan tekstualni niz (znak *). Obično to vidite s tekstualnom datotekom, ali možete upisati tekst u binarnu datoteku.
Ovaj primjer otvara binarnu datoteku za pisanje, a zatim u nju upisuje znak char * (string). Promjena FILE * vraća se iz poziva fopen (). Ako ovo ne uspije (datoteka može postojati i biti otvorena ili samo za čitanje ili može postojati greška s imenom datoteke), vraća se 0.
Naredba fopen () pokušava otvoriti navedenu datoteku. U ovom slučaju je test.txt u istoj mapi kao i aplikacija. Ako datoteka sadrži put, tada se sva kosa kosa crta moraju udvostručiti. "c: \ mapa \ test.txt" nije točna; morate koristiti "c: \\ mapu \\ test.txt".
Kako je način rada "wb", ovaj se kod upisuje u binarnu datoteku. Datoteka je stvorena ako ne postoji, a ako postoji, obriše se sve što je bilo u njoj. Ako poziv za foping ne uspije, možda zato što je datoteka otvorena ili ime sadrži nevažeće znakove ili nevaljanu stazu, fopen vraća vrijednost 0.
Iako biste mogli samo provjeriti da li ft nije nula (uspjeh), ovaj primjer ima funkciju FileSuccess () da to eksplicitno učinite. U sustavu Windows emitira se uspjeh / neuspjeh poziva i imena datoteke. Malo je naporno ako nakon performansa možete ograničiti ovo uklanjanje pogrešaka. U sustavu Windows malo je prekomjernog izlaznog teksta u program za uklanjanje pogrešaka.
Pozivi fwrite () reproduciraju navedeni tekst. Drugi i treći parametar su veličina znakova i duljina niza. Oba su definirana kao size_t koji je cijeli broj bez znaka. Rezultat ovog poziva je pisanje brojeva stavki određene veličine. Imajte na umu da s binarnim datotekama, iako pišete niz (char *), ne dodaje nikakav povratni znak nosača ili znak unosa linije. Ako ih želite, morate ih izričito uključiti u niz.
Načini datoteka za čitanje i pisanje datoteka
Kad otvorite datoteku, odredite kako je treba otvoriti - želite li je kreirati iz nove ili je prebrisati te je li tekstualna ili binarna, čitati ili pisati i želite li je dodati. To se postiže korištenjem jednog ili više odrednica načina rada datoteka koja su jednostruka slova "r", "b", "w", "a" i "+" u kombinaciji s ostalim slovima.
- r - Otvara datoteku za čitanje. Ovo ne uspije ako datoteka ne postoji ili je ne može pronaći.
- w - Otvara datoteku kao praznu datoteku za pisanje. Ako datoteka postoji, njezin se sadržaj uništava.
- a - otvara datoteku za pisanje na kraju datoteke (dodavanje) bez uklanjanja EOF markera prije upisivanja novih podataka u datoteku; ovo prvo stvara datoteku ako ne postoji.
Dodavanjem "+" u način datoteke stvara se tri nova načina:
- r + - Otvara datoteku i za čitanje i za pisanje. (Datoteka mora postojati.)
- w + - otvara datoteku kao praznu datoteku i za čitanje i za pisanje. Ako datoteka postoji, njezin se sadržaj uništava.
- a + - otvara datoteku za čitanje i dodavanje; operacija dodavanja uključuje uklanjanje EOF markera prije nego što se u datoteku upišu novi podaci, a EOF marker se obnavlja po završetku pisanja. Najprije stvori datoteku ako ne postoji. Otvara datoteku za čitanje i dodavanje; operacija dodavanja uključuje uklanjanje EOF markera prije nego što se u datoteku upišu novi podaci, a EOF marker se obnavlja po završetku pisanja. Najprije stvori datoteku ako ne postoji.
Kombinacije načina datoteke
Ova tablica prikazuje kombinacije načina rada datoteka i za tekstualne i za binarne datoteke. Obično čitate ili pišete u tekstualnu datoteku, ali ne i jedno i drugo istovremeno. Pomoću binarne datoteke možete istovremeno čitati i pisati u istu datoteku. Donja tablica prikazuje što možete učiniti sa svakom kombinacijom.
- r tekst - čitati
- rb + binarni - čitati
- r + tekst - čitati, pisati
- r + b binarni - čitati, pisati
- rb + binarni - čitati, pisati
- w tekst - pisati, stvarati, skraćivati
- wb binary - pisanje, stvaranje, skraćivanje
- w + tekst - čitati, pisati, stvarati, skraćivati
- w + b binarno - čitati, pisati, stvarati, skraćivati
- wb + binary - čitati, pisati, kreirati, skraćivati
- tekst - pisati, stvarati
- ab binary - pisati, stvarati
- a + tekst - čitati, pisati, stvarati
- a + b binarni - pisati, stvarati
- ab + binarno - pisati, stvarati
Ako samo ne stvorite datoteku (koristite "wb") ili je samo čitate (koristite "rb"), možete se izvući s "w + b".
Neke implementacije dopuštaju i druga slova. Microsoft, na primjer, omogućava:
- t - tekstualni način rada
- c - počiniti
- n - ne-počiniti
- S - optimiziranje keširanja za uzastopni pristup
- R - keširanje nesekvencijalnog (slučajni pristup)
- T - privremena
- D - brisanje / privremeno, što datoteku ubija kad je zatvorena.
Oni nisu prenosivi pa ih koristite za vlastiti rizik.
Primjer datoteke s nasumičnim pristupom
Glavni razlog upotrebe binarnih datoteka je fleksibilnost koja omogućuje čitanje ili pisanje bilo gdje u datoteci. Tekstualne datoteke omogućuju vam samo čitanje ili pisanje uzastopno. S prevladavanjem jeftinih ili besplatnih baza podataka kao što su SQLite i MySQL, smanjuje potrebu korištenja slučajnog pristupa na binarnim datotekama. Međutim, slučajni pristup zapisima datoteka pomalo je staromodan, ali ipak koristan.
Ispitivanje primjera
Pretpostavimo da primjer prikazuje par datoteka indeksa i podataka koji pohranjuju nizove u datoteku sa slučajnim pristupom. Žice su različite duljine i indeksirane su položajima 0, 1 i tako dalje.
Postoje dvije prazne funkcije: CreateFiles () i ShowRecord (int recnum). CreateFiles koristi char * međuspremnik veličine 1100 za držanje privremenog niza sastavljenog od niza formata msg praćenog od n zvjezdica gdje n varira od 5 do 1004. Dva FILE * kreirana su oba pomoću wb filemode u varijablama ftindex i ftdata. Nakon stvaranja, oni se koriste za manipuliranje datotekama. Dvije datoteke su
- Index.dat
- data.dat
Datoteka indeksa sadrži 1000 zapisa tipa indextype; ovo je strukt indekstip koji ima dva člana pos (tipa fpos_t) i veličinu. Prvi dio petlje:
popunjava niz msg ovako.
i tako dalje. Onda ovo:
pušta strukturu duljinom niza i točkom u datoteci s podacima u koju će se zapisati niz.
U ovom se trenutku i indeksna datoteka i niz podataka mogu zapisati u njihove datoteke. Iako su to binarne datoteke, one se pišu uzastopno. Teoretski, mogli biste pisati zapise na poziciju izvan trenutnog kraja datoteke, ali to nije dobra tehnika za korištenje i vjerojatno uopće nije prenosiva.
Završni dio je zatvaranje obje datoteke. Ovo osigurava da se zadnji dio datoteke zapiše na disk. Tijekom pisanja datoteka, mnoštvo zapisa ne ide izravno na disk, već se čuva u međuspremnicima određene veličine. Nakon što slovo ispuni međuspremnik, cjelokupni sadržaj međuspremnika piše se na disk.
Funkcija ispiranja datoteke forsira ispiranje i možete odrediti strategije ispiranja datoteka, ali one su namijenjene tekstualnim datotekama.
Funkcija ShowRecord
Da biste provjerili da se svaki određeni zapis iz datoteke podataka može dohvatiti, morate znati dvije stvari: odakle počinje u datoteci podataka i koliko je velik.
To radi indeksna datoteka. Funkcija ShowRecord otvara obje datoteke, traži odgovarajuću točku (recnum * sizeof (indextype) i dobiva određeni broj bajtova = sizeof (indeks).
SEEK_SET je konstanta koja određuje odakle se radi fseek. Za to su definirane još dvije konstante.
- SEEK_CUR - tražite u odnosu na trenutni položaj
- SEEK_END - potražite apsolut s kraja datoteke
- SEEK_SET - tražite apsolut od početka datoteke
Možete upotrebljavati SEEK_CUR za pomicanje pokazivača datoteke naprijed prema sizeof (indeksu).
Dobivši veličinu i položaj podataka, preostaje nam samo dohvatiti ih.
Ovdje koristite fsetpos () zbog vrste index.pos koji je fpos_t. Alternativni način je upotreba ftella umjesto fgetposa i fseka umjesto fgetposa. Par fseek i ftell rade s int dok fgetpos i fsetpos koriste fpos_t.
Nakon čitanja zapisa u memoriju, dodaje se null \ \ znak i pretvara ga u pravilan c-string. Ne zaboravite ili ćete se sudariti. Kao i prije, fclose se poziva na obje datoteke. Iako nećete izgubiti nikakve podatke ako zaboravite fclose (za razliku od pisanja), imat ćete curenje memorije.