C Tiedostot I/O: Luo, avaa, lue, kirjoita ja sulje tiedosto

⚡ Älykäs yhteenveto

C-kielen tiedostonkäsittely tallentaa pysyvää dataa levylle stdio-kirjaston kautta, joka avaa tiedoston fopen-komennolla, kirjoittaa fputc-, fputs- tai fprintf-komennolla, lukee tiedoston fgetc-, fgets- tai fscanf-komennolla ja sulkee sen fclose-komennolla.

  • 📁 Tiedostotilat: Fopen-funktiolle välitetty tilamerkkijono — r, w, a, r+, w+ tai a+ — määrittää, luetaanko tiedosto, korvataanko se vai lisätäänkö siihen uusi tiedosto.
  • 🇧🇷 Tietojen kirjoittaminen: fputc kirjoittaa yhden merkin, fputs kirjoittaa merkkijonon ja fprintf kirjoittaa muotoiltua tekstiä tiedosto-osoittimeen.
  • ???? Datan lukeminen: fgetc lukee merkin, fgets lukee rivin puskuriin ja fscanf jäsentää muotoillut tokenit tiedostosta.
  • 🔒 Tiedostojen sulkeminen: fclose tyhjentää puskuroidut tiedot ja vapauttaa tiedoston, palauttaen 0 onnistumisen yhteydessä ja EOF epäonnistumisen yhteydessä.
  • 🔁 Interaktiivinen I/O: getc ja putc käsittelevät yhden merkin kerrallaan siirtäen syötteen suoraan tiedostoon ja takaisin ulos.
  • 🤖 AI-apu: GitHub Copilot ja tekoälyavustajat tukevat fopen-, fprintf- ja fgets-rutiineja ja merkitsevät puuttuvia NULL-tarkistuksia tai sulkemattomia tiedostoja.

C Tiedostot I/O

C Tiedostonhallinta

Tiedostoa voidaan käyttää suuren määrän pysyvän datan tallentamiseen. Kuten monet muutkin kielet, C tarjoaa seuraavan tiedostonhallinnan tehtävät,

  1. Tiedoston luominen
  2. Tiedoston avaaminen
  3. Tiedoston lukeminen
  4. Kirjoittaminen tiedostoon
  5. Tiedoston sulkeminen

Seuraavassa on tärkeimmät tiedostojen hallintatoiminnot, jotka ovat saatavilla 'C:ssä'

toiminto tarkoitus
fopen() Tiedoston luominen tai olemassa olevan tiedoston avaaminen
fclose () Tiedoston sulkeminen
fprintf() Tietolohkon kirjoittaminen tiedostoon
fscanf () Lohkotietojen lukeminen tiedostosta
getc () Lukee yhden merkin tiedostosta
putc () Kirjoittaa tiedostoon yhden merkin
getw () Lukee tiedostosta kokonaisluvun
putw () Kokonaisluvun kirjoittaminen tiedostoon
fseek () Asettaa tiedoston osoittimen sijainnin tiettyyn paikkaan
ftell () Palauttaa tiedostoosoittimen nykyisen sijainnin
kelaa taaksepäin () Asettaa tiedostoosoittimen tiedoston alkuun

Kuinka luoda tiedosto

Aina kun haluat käsitellä tiedostoa, ensimmäinen askel on luoda tiedosto. Tiedosto ei ole muuta kuin tilaa muistissa, johon tiedot tallennetaan.

Tiedoston luomiseen C-ohjelmassa käytetään seuraavaa syntaksia,

FILE *fp;
fp = fopen ("file_name", "mode");

Yllä olevassa syntaksissa tiedosto on tietorakenne, joka on määritelty vakiokirjastossa.

fopen on vakiotoiminto, jota käytetään tiedoston avaamiseen.

  • Jos tiedostoa ei ole järjestelmässä, se luodaan ja avataan.
  • Jos tiedosto on jo järjestelmässä, se avataan suoraan tällä toiminnolla.

fp on tiedosto osoitin joka viittaa tyyppitiedostoon.

Aina kun avaat tai luot tiedoston, sinun on määritettävä, mitä aiot tehdä tiedostolla. C-ohjelmointitiedosto voidaan luoda tai avata luku-/kirjoitustarkoituksiin. Tilaa käytetään määrittämään, haluatko avata tiedoston johonkin alla mainituista tarkoituksista. Seuraavassa on erityyppiset C-ohjelmoinnin tilat, joita voidaan käyttää tiedoston kanssa työskennellessä.

Tiedostotila Tuotetiedot
r Avaa tiedosto lukemista varten. Jos tiedosto on lukutilassa, tietoja ei poisteta, jos tiedosto on jo järjestelmässä.
w Avaa tiedosto kirjoittamista varten. Jos tiedosto on kirjoitustilassa, uusi tiedosto luodaan, jos tiedostoa ei ole ollenkaan. Jos tiedosto on jo järjestelmässä, kaikki tiedoston sisältämät tiedot katkaistaan ​​ja se avataan kirjoittamista varten.
a Avaa tiedosto liittämistilassa. Jos tiedosto on liittämistilassa, tiedosto avataan. Tiedoston sisältö ei muutu.
r+ avoin lukemista ja kirjoittamista varten alusta alkaen
w+ avoinna lukemista ja kirjoittamista varten, tiedoston päällekirjoittamista
a+ avoinna lukemista ja kirjoittamista varten, liittäminen tiedostoon

Annetussa syntaksissa tiedostonimi ja tila määritetään seuraavasti jouset siksi ne on aina suljettava lainausmerkkeihin.

Esimerkiksi:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

lähtö:

Tiedosto luodaan samaan kansioon, johon olet tallentanut koodisi.

Tiedoston luominen C-ohjelman tulosteena

Voit määrittää polun, johon haluat luoda tiedoston

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Luo tiedosto C-kielellä määritetyllä polulla

Kuinka sulkea tiedosto

Tiedosto tulee aina sulkea aina, kun tiedoston toiminnot ovat ohi. Se tarkoittaa, että tiedoston sisältö ja linkit on lopetettu. Tämä estää tiedoston vahingossa vahingoittumisen.

"C" tarjoaa fclose-toiminnon tiedoston sulkemiseen. Fclose-syntaksi on seuraava,

fclose (file_pointer);

Esimerkiksi:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

Fclose-funktio ottaa argumenttina tiedosto-osoittimen. Tiedosto-osoittimeen liittyvä tiedosto suljetaan sitten fclose-funktion avulla. Se palauttaa arvon 0, jos sulkeminen onnistui, ja EOF:n (tiedoston loppu), jos tiedostoa suljettaessa on tapahtunut virhe.

Tiedoston sulkemisen jälkeen samaa tiedostoosoitinta voidaan käyttää myös muiden tiedostojen kanssa.

'C'-ohjelmoinnissa tiedostot suljetaan automaattisesti, kun ohjelma lopetetaan. Tiedoston sulkeminen manuaalisesti kirjoittamalla fclose-toiminto on hyvä ohjelmointikäytäntö.

Kirjoittaminen tiedostoon

C:ssä, kun kirjoitat tiedostoon, rivinvaihtomerkit '\n' on lisättävä erikseen.

Stdio-kirjasto tarjoaa tarvittavat toiminnot tiedostoon kirjoittamiseen:

  • fputc(char, file_pointer): Kirjoittaa merkin tiedostoon, johon file_pointer osoittaa.
  • fputs(str, file_pointer): Kirjoittaa merkkijonon tiedostoon, johon file_pointer osoittaa.
  • fprintf(file_pointer, str, variable_lists): Tulostaa merkkijonon tiedostosta, johon file_pointer viittaa. Merkkijono voi halutessaan sisältää muotomäärittelijöitä ja luettelon muuttujista variable_lists.

Alla oleva ohjelma näyttää kuinka kirjoittaa tiedostoon:

fputc()-funktio:

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

lähtö:

fputc()-funktion tuloste C:ssä

Yllä oleva ohjelma kirjoittaa yhden merkin fputc_test.txt-tiedostoon, kunnes se saavuttaa seuraavan rivin symbolin "\n", joka osoittaa, että lause on kirjoitettu onnistuneesti. Prosessissa otetaan jokainen taulukon merkki ja kirjoitetaan se tiedostoon.

fputc_test.txt-tiedoston sisältö kirjoitettuna C-kielellä

  1. Yllä olevassa ohjelmassa olemme luoneet ja avanneet tiedoston nimeltä fputc_test.txt kirjoitustilassa ja ilmoittaneet merkkijonomme, joka kirjoitetaan tiedostoon.
  2. Kirjoitamme merkki kerrallaan käyttämällä for-silmukkaa ja laitamme jokaisen merkin tiedostoomme, kunnes \n-merkki kohtaamme, sitten tiedosto suljetaan fclose-funktiolla.

fputs () Toiminto:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

lähtö:

fputs()-funktion tuloste C:ssä

fputs_test.txt-tiedoston sisältö C-kielellä

  1. Yllä olevassa ohjelmassa olemme luoneet ja avanneet tiedoston nimeltä fputs_test.txt kirjoitustilassa.
  2. Kun olemme tehneet kirjoitusoperaation fputs()-funktiolla kirjoittamalla kolme eri merkkijonoa
  3. Sitten tiedosto suljetaan fclose-toiminnolla.

fprintf()-funktio:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

lähtö:

fprintf()-funktion tuloste C:ssä

fprintf_test.txt-tiedoston sisältö C-kielellä

  1. Yllä olevassa ohjelmassa olemme luoneet ja avanneet tiedoston nimeltä fprintf_test.txt kirjoitustilassa.
  2. Kun kirjoitustoiminto on suoritettu fprintf()-funktiolla kirjoittamalla merkkijono, tiedosto suljetaan fclose-funktiolla.

Tietojen lukeminen tiedostosta

Tietojen lukemiseen tiedostosta on kolme erilaista toimintoa

  • fgetc(file_pointer): Palauttaa tiedostosta seuraavan merkin, johon tiedostoosoitin viittaa. Kun tiedoston loppu on saavutettu, lähetetään takaisin EOF.
  • fgets(buffer, n, file_pointer): Se lukee n-1 merkkiä tiedostosta ja tallentaa merkkijonon puskuriin, johon viimeiseksi merkiksi lisätään NULL-merkki '\0'.
  • fscanf(file_pointer, conversion_specifiers, variable_adresses): Sitä käytetään datan jäsentämiseen ja analysointiin. Se lukee merkkejä tiedostosta ja määrittää syötteen muuttujaosoittimien luetteloon variable_adresses käyttäen muunnosmäärittelijöitä. Muista, että kuten scanf:ssäkin, fscanf lopettaa merkkijonon lukemisen, kun kohtaa välilyönnin tai rivinvaihdon.

Seuraava ohjelma näyttää lukemisen fputs_test.txt-tiedostosta käyttämällä fgets(),fscanf()- ja fgetc()-funktioita vastaavasti:

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

Tulos:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Tiedoston lukeminen C-tulosteesta

  1. Yllä olevassa ohjelmassa olemme avanneet tiedoston nimeltä “fprintf_test.txt”, joka on aiemmin kirjoitettu fprintf()-funktiolla, ja se sisältää tiedoston “Learning C with Guru99” merkkijono. Luemme sen fgets()-funktiolla, joka lukee rivi riviltä, ​​ja puskurin koon on oltava riittävä koko rivin käsittelemiseen.
  2. Avaamme tiedoston uudelleen palauttaaksemme osoittimen osoittamaan tiedoston alkuun. Luomme erilaisia ​​merkkijonomuuttujia käsittelemään kutakin sanaa erikseen. Tulosta muuttujat nähdäksesi niiden sisällön. fscanf()-funktiota käytetään pääasiassa ...tract ja jäsentää tietoja tiedostosta.
  3. Avaa tiedosto uudelleen palauttaaksesi osoitintiedoston osoittamaan tiedoston alkuun. Lue tiedot ja tulosta se tiedostosta merkki merkiltä käyttämällä getc()-funktiota, kunnes EOF-käsky löytyy
  4. Suoritettuamme lukutoimintotiedoston eri muunnelmilla, suljemme tiedoston uudelleen fclose-toiminnolla.

Interaktiivinen tiedosto Lue ja kirjoita getc:llä ja putc:lla

Nämä ovat yksinkertaisimpia tiedostotoimintoja. Getc on lyhenne sanoista get character, ja putc tarkoittaa put character. Näitä kahta toimintoa käytetään käsittelemään vain yhtä merkkiä kerrallaan.

Seuraava ohjelma esittelee C-ohjelmoinnin tiedostojenkäsittelytoiminnot:

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

lähtö:

Vuorovaikutteinen tiedoston luku ja kirjoitus C-tulosteessa

getc- ja putc-tiedostojen käsittelytuloste C:ssä

  1. Yllä olevassa ohjelmassa olemme luoneet ja avaneet tiedoston nimeltä demo kirjoitustilassa.
  2. Kun kirjoitus on suoritettu, tiedosto suljetaan fclose-toiminnolla.
  3. Avasimme jälleen tiedoston, joka sisältää nyt dataa lukutilassa. While-silmukka suoritetaan, kunnes eof on löydetty. Kun tiedoston loppu on löydetty, toiminto lopetetaan ja tiedot näytetään printf-toiminnolla.
  4. Lukutoiminnon suorittamisen jälkeen tiedosto suljetaan uudelleen fclose-toiminnolla.

UKK

Tekstitila muuntaa rivinvaihdot käyttöjärjestelmän mukaisiksi, kun taas binääritila, joka avataan komennolla "rb" tai "wb", kirjoittaa tavut täsmälleen sellaisina kuin ne ovat. Käytä binääritilaa kuville, äänelle tai mille tahansa datalle, jonka tarkka tavuasettelu on säilytettävä.

Fopen-funktio palauttaa NULL-arvon, kun tiedostoa ei voida avata, kuten jos tiedosto puuttuu, käyttöoikeudet on evätty tai levy on täynnä. Testaa aina palautettua osoitinta NULL-arvon suhteen ennen lukemista tai kirjoittamista, muuten ohjelma käyttää virheellistä osoitinta ja yleensä kaatuu.

Kirjoitustila ”w” katkaisee olemassa olevan tiedoston poistamalla sen sisällön ennen kirjoittamista ja luo tiedoston, kun sitä ei ole. Lisäystila ”a” säilyttää olemassa olevat tiedot ja lisää uuden sisällön loppuun, joten mitään jo tallennettua ei menetetä.

fseek siirtää tiedosto-osoittimen SEEK_SET-, SEEK_CUR- tai SEEK_END-arvosta mitattuun tavupoikkeamaan. ftell palauttaa osoittimen nykyisen tavun sijainnin ja rewind lähettää sen takaisin tiedoston alkuun. Yhdessä ne tarjoavat satunnaisen lukemisen peräkkäisen lukemisen sijaan.

fgets lukee koko rivin, stopping rivinvaihdon kohdalla tai n-1 merkin jälkeen, joten se kunnioittaa puskurin kokoa. fscanf lukee muotoillut, välilyönnillä erotetut tunnukset ja voi ylivuotoa lyhyen taulukon yli. Koko rivien turvalliseen lukemiseen fgets on parempi valinta.

EOF on vakio, yleensä -1, joka merkitsee tiedoston loppua. Lukufunktiot, kuten getc, fgetc ja fscanf, palauttavat EOF-arvon, kun dataa ei enää ole jäljellä, minkä vuoksi silmukat vertaavat tulostaan ​​EOF-arvoon lukemisen lopettamiseksi.

Kyllä. Tekoälykoodausavustaja voi luoda fopen-, fprintf- ja fgets-rutiineja selkokielisestä kehotteesta, selittää jokaisen tiedostotilan ja havaita virheitä, kuten puuttuvan NULL-tarkistuksen tai sulkemattoman tiedoston. Käännä ja testaa aina tekoälyn ehdottama koodi ennen kuin luotat siihen.

GitHub Copilot kirjoittaa C-kielistä tiedostojen käsittelykoodia, joka ehdottaa kokonaisia ​​fopen-, fputs- ja fscanf-lohkoja lyhyen kommentin tai funktion nimen pohjalta. Se lisää usein vastaavan fclose-kutsua ja virheentarkistuksen, vaikka luotu logiikka kannattaa silti tarkistaa.

Tiivistä tämä viesti seuraavasti: