Yksinkertaisimpien sovellusten lisäksi useimpien ohjelmien on luettava tai kirjoitettava tiedostoja. Se voi olla tarkoitettu vain konfigurointitiedoston tai tekstijäsentäjän tai jotain hienostuneemman lukemiseen. Tämä opetusohjelma keskittyy hajasaantitiedostojen käyttöön C: ssä.
Random Access File I / O -sovelluksen ohjelmointi C: ssä

Tiedoston perustoiminnot ovat:
- fopen - avaa tiedosto - määritä, kuinka se avataan (lue / kirjoita) ja tyyppi (binaari / teksti)
- fclose - sulje avattu tiedosto
- fread - lukea tiedostosta
- fwrite - kirjoita tiedostoon
- fseek / fsetpos - siirrä tiedostoosoitin jonnekin tiedostoon
- ftell / fgetpos - kertoo, missä tiedostoosoitin sijaitsee
Kaksi perustiedostotyyppiä ovat teksti ja binääri. Näistä kahdesta binaaritiedostot ovat yleensä yksinkertaisempia käsittelemään. Tästä syystä ja koska tekstitiedoston satunnainen käyttö ei ole jotain mitä sinun täytyy tehdä usein, tämä opetusohjelma on rajoitettu binaaritiedostoihin. Edellä luetellut neljä ensimmäistä toimintoa koskevat sekä teksti- että satunnaisesti käytettäviä tiedostoja. Kaksi viimeistä vain satunnaista käyttöä varten.
Satunnainen käyttö tarkoittaa, että voit siirtyä mihin tahansa tiedoston osaan ja lukea tai kirjoittaa tietoja siitä joutumatta lukemaan koko tiedostoa. Vuosia sitten tietoja tallennettiin suurille rullille tietokoneteipille. Ainoa tapa päästä nauhan pisteeseen oli lukemalla koko nauhan läpi. Sitten levyt tulivat mukana ja nyt voit lukea minkä tahansa tiedoston osan suoraan.
Ohjelmointi binaaritiedostoilla
Binaaritiedosto on minkä tahansa pituinen tiedosto, jossa on tavuja, joiden arvot ovat välillä 0–255. Näillä tavuilla ei ole muuta merkitystä toisin kuin tekstitiedostossa, jossa arvo 13 tarkoittaa siirtopalautusta, 10 tarkoittaa rivinsyöttöä ja 26 tarkoittaa tiedoston loppua. Tekstitiedostoja lukevien ohjelmistojen on käsiteltävä näitä muita merkityksiä.
Binaaritiedostot virta tavua, ja nykyaikaiset kielet toimivat yleensä streamien kuin tiedostojen sijaan. Tärkeä osa on tietovirta sen sijaan, mistä se tuli. Sisään C, voit ajatella tietoja joko tiedostoina tai streamina. Satunnaisella pääsyllä voit lukea tai kirjoittaa mihin tahansa tiedoston tai streamin osaan. Peräkkäisellä käyttöoikeudella sinun on siirrettävä tiedosto tai suoratoisto alusta alkaen kuin iso nauha.
Tämä koodinäyte näyttää yksinkertaisen binaaritiedoston avaamisen kirjoittamista varten, ja siihen kirjoitetaan tekstimerkkijono (char *). Yleensä tämä näkyy tekstitiedostona, mutta voit kirjoittaa tekstiä binaaritiedostoon.
Tämä esimerkki avaa binaaritiedoston kirjoittamista varten ja kirjoittaa sitten char * (merkkijono) siihen. FILE * -muuttuja palautetaan fopen () -puhelusta. Jos tämä epäonnistuu (tiedosto voi olla olemassa ja olla avoin tai vain luku -tyyppinen tai tiedostonimessä voi olla vika), se antaa 0.
Fopen () -komento yrittää avata määritetyn tiedoston. Tässä tapauksessa se on test.txt samassa kansiossa kuin sovellus. Jos tiedosto sisältää polun, kaikki alaviivat on kaksinkertaistettava. "c: \ kansio \ test.txt" on väärä; sinun on käytettävä "c: \\ kansio \\ test.txt".
Koska tiedostomuoto on "wb", tämä koodi kirjoittaa binaaritiedostoon. Tiedosto luodaan, jos sitä ei ole, ja jos se on, mikä tahansa siinä oli, poistetaan. Jos fopen-kutsu epäonnistuu, esimerkiksi koska tiedosto oli auki tai nimessä on virheellisiä merkkejä tai virheellinen polku, fopen antaa arvon 0.
Vaikka voisit vain tarkistaa, ettei ft ole nolla (menestys), tässä esimerkissä on FileSuccess () -toiminto, joka tekee tämän nimenomaisesti. Windowsissa se tulostaa puhelun onnistumisen / epäonnistumisen ja tiedostonimen. Se on hiukan vaivalloista, jos olet suorituksen jälkeen, joten saatat rajoittaa tämän virheenkorjaukseen. Windowsissa järjestelmävirheenkorjaimeen on vain vähän tekstiä.
Fwrite () -kutsu tuottaa määritetyn tekstin. Toinen ja kolmas parametri ovat merkkien koko ja merkkijonon pituus. Molemmat määritellään koon_t arvoksi, joka on allekirjoittamaton kokonaisluku. Tämän puhelun tuloksena on kirjoittaa määrätyn kokoisia kappaleita. Huomaa, että vaikka binaaritiedostot kirjoittavat merkkijonoa (char *), se ei lisää kuljetuspalautus- tai rivinsyöttömerkkejä. Jos haluat niitä, sinun on sisällytettävä ne nimenomaisesti merkkijonoon.
Tiedostomuodot tiedostojen lukemiseen ja kirjoittamiseen
Kun avaat tiedoston, määrität miten se avataan - luodaanko se uudesta vai korvataanko se ja onko teksti vai binaari, luetko tai kirjoitatko ja haluatko liittää sen. Tämä tehdään käyttämällä yhtä tai useampaa tiedostomuodomääritystä, jotka ovat yksittäisiä kirjaimia "r", "b", "w", "a" ja "+" yhdessä muiden kirjainten kanssa.
- r - Avaa tiedoston lukemista varten. Tämä epäonnistuu, jos tiedostoa ei ole tai sitä ei löydy.
- w - Avaa tiedoston tyhjänä tiedostoa kirjoittamista varten. Jos tiedosto on olemassa, sen sisältö tuhoutuu.
- a - Avaa tiedoston kirjoittamista varten tiedoston lopussa (liite) poistamatta EOF-merkintää, ennen kuin kirjoitat tiedostoon uutta tietoa; tämä luo tiedoston ensin, jos sitä ei ole.
Lisäämällä "+" tiedostotilaan luodaan kolme uutta tilaa:
- r + - Avaa tiedoston lukemista ja kirjoittamista varten. (Tiedoston on oltava olemassa.)
- w + - Avaa tiedoston tyhjänä sekä lukemista että kirjoittamista varten. Jos tiedosto on olemassa, sen sisältö tuhoutuu.
- a + - Avaa tiedoston lukemista ja liittämistä varten; liitteenä olevaan toimintaan sisältyy EOF-merkin poisto ennen uuden datan kirjoittamista tiedostoon, ja EOF-merkki palautetaan kirjoittamisen jälkeen. Se luo tiedoston ensin, jos sitä ei ole. Avaa tiedoston lukemista ja liittämistä varten; liitteenä olevaan toimintaan sisältyy EOF-merkin poisto ennen uuden datan kirjoittamista tiedostoon, ja EOF-merkki palautetaan kirjoittamisen jälkeen. Se luo tiedoston ensin, jos sitä ei ole.
Tiedostomuodon yhdistelmät
Tämä taulukko näyttää sekä teksti- että binaaritiedostojen tiedotilayhdistelmät. Yleensä joko luet tai kirjoitat tekstitiedostoon, mutta et molemmat samanaikaisesti. Binaaritiedoston avulla voit sekä lukea että kirjoittaa samaan tiedostoon. Seuraava taulukko näyttää mitä voit tehdä jokaisella yhdistelmällä.
- r teksti - lue
- rb + binaarinen - lue
- r + teksti - lue, kirjoita
- r + b binaarinen - lue, kirjoita
- rb + binary - lue, kirjoita
- w teksti - kirjoita, luo, katkaise
- wb binary - kirjoita, luo, katkaise
- w + teksti - lue, kirjoita, luo, katkaise
- w + b binaarinen - lukea, kirjoittaa, luoda, katkaista
- wb + binaari - lue, kirjoita, luo, katkaise
- teksti - kirjoita, luo
- ab binary - kirjoita, luo
- + teksti - lue, kirjoita, luo
- a + b binaarinen - kirjoita, luo
- ab + binaarinen - kirjoita, luo
Ellet ole vain luomassa tiedostoa (käytä "wb") tai lukemassa vain yhtä (käytä "rb"), voit päästä eroon käyttämällä "w + b".
Jotkut toteutukset sallivat myös muut kirjaimet. Microsoftsallii esimerkiksi:
- t - tekstitila
- c - sitoudu
- n - sitoutumaton
- S - välimuistin optimointi peräkkäistä käyttöä varten
- R - välimuisti välitön (välitön pääsy)
- T - väliaikainen
- D - poista / väliaikainen, joka tappaa tiedoston, kun se suljetaan.
Nämä eivät ole kannettavat, joten käytä niitä omassa vaarassasi.
Esimerkki hajasaantitiedostojen tallennuksesta
Tärkein syy binaaritiedostojen käyttöön on joustavuus, jonka avulla voit lukea tai kirjoittaa minne tahansa tiedostossa. Tekstitiedostojen avulla voit lukea tai kirjoittaa vain peräkkäin. Kun esiintyy halpoja tai ilmaisia tietokantoja, kuten SQLite ja MySQL, vähentää tarvetta käyttää satunnaista käyttöä binaaritiedostoissa. Satunnainen pääsy tiedostoihin on kuitenkin hiukan vanhanaikainen, mutta silti hyödyllinen.
Tarkastellaan esimerkkiä
Oletetaan, että esimerkki näyttää hakemisto- ja datatiedostoparin, joka tallentaa merkkijonot hajasaantitiedostoon. Merkkijonot ovat eripituisia ja indeksoidaan asemilla 0, 1 ja niin edelleen.
On kaksi tyhjää toimintoa: CreateFiles () ja ShowRecord (int recnum). CreateFiles käyttää char * -puskuria, jonka koko on 1100, väliaikaisen merkkijonon, joka koostuu muodon merkkijono msg, seurannasta n tähdellä, joissa n vaihtelee välillä 5 - 1004. Kaksi tiedostoa * luodaan molemmat käyttämällä wb-tiedostomuotoa muuttujissa ftindex ja ftdata. Luomisen jälkeen niitä käytetään tiedostojen käsittelemiseen. Nämä kaksi tiedostoa ovat
- Index.dat
- Data.dat
Hakemistotiedostoon sisältyy 1000 tietuetta tyyppiä indextype; tämä on rakenteellinen hakemistotyyppi, jolla on kaksi jäsentä (tyyppi fpos_t) ja koko. Silmukan ensimmäinen osa:
täyttää merkkijonoviestin näin.
ja niin edelleen. Sitten tämä:
täyttää rakenteen merkkijonon pituudella ja sen datan tiedoston pisteellä, johon merkkijono kirjoitetaan.
Tässä vaiheessa sekä hakemistotiedoston rakenne että tietotiedoston merkkijono voidaan kirjoittaa vastaaviin tiedostoihin. Vaikka nämä ovat binaaritiedostoja, ne kirjoitetaan peräkkäin. Teoriassa voit kirjoittaa tietueita tiedoston nykyisen lopun ulkopuolelle, mutta se ei ole hyvä tekniikka käyttää eikä todennäköisesti ollenkaan siirrettävissä.
Viimeinen osa on sulkea molemmat tiedostot. Tämä varmistaa, että tiedoston viimeinen osa kirjoitetaan levylle. Tiedostojen kirjoittamisen aikana monet kirjoituksista eivät mene suoraan levylle, vaan pidetään kiinteän kokoisissa puskureissa. Kun kirjoitus on täyttänyt puskurin, puskurin koko sisältö kirjoitetaan levylle.
Tiedoston huuhtelutoiminto pakottaa huuhtelua ja voit myös määrittää tiedoston huuhtelustrategiat, mutta ne on tarkoitettu tekstitiedostoille.
ShowRecord-toiminto
Testaaksesi, että tietyt tiedostosta määritetyt tietueet voidaan noutaa, sinun on tiedettävä kaksi asiaa: mistä se alkaa datatiedostossa ja kuinka suuri se on.
Tätä indeksitiedosto tekee. ShowRecord-toiminto avaa molemmat tiedostot, etsii oikeaan pisteeseen (recnum * sizeof (hakemistotyyppi) ja hakee useita tavuja = sizeof (hakemisto).
SEEK_SET on vakio, joka määrittelee mistä fseek tehdään. Tätä varten on määritelty kaksi muuta vakioita.
- SEEK_CUR - etsi suhteessa nykyiseen sijaintiin
- SEEK_END - etsi absoluuttinen tiedoston lopusta
- SEEK_SET - etsi absoluuttinen tiedoston alusta
Voit käyttää SEEK_CUR-tiedostoa siirtääksesi osoittimen eteenpäin koon mukaan (hakemisto).
Saatuaan tiedon koon ja sijainnin, on vain haettava se.
Käytä tässä fsetpos () -tyyppiä, koska index.pos-tyyppi on fpos_t. Vaihtoehtoinen tapa on käyttää ftelliä fgetposin sijasta ja fsek sijasta fgetpos. Pari fseek ja ftell toimivat int kanssa, kun taas fgetpos ja fsetpos käyttävät fpos_t.
Kun olet lukenut tietueen muistiin, siihen lisätään nollamerkki \ 0 sen muuttamiseksi oikeiksi C-kielinen. Älä unohda sitä, muuten saat kaatua. Kuten aikaisemmin, molemmat tiedostot vaativat fclosea. Vaikka et menetä mitään tietoja, jos unohdat sulkemisen (toisin kuin kirjoittaminen), muisti vuotaa.