logo

Failų tvarkymo pagrindai C

Failų perdavimas C yra procesas, kurio metu mes kuriame, atidarome, skaitome, rašome ir uždarome operacijas su failu. C kalba teikia įvairias funkcijas, tokias kaip fopen(), fwrite(), fread(), fseek(), fprintf() ir kt., kad mūsų programoje būtų galima atlikti įvesties, išvesties ir daugybę skirtingų C failo operacijų.

Kodėl mums reikia failų tvarkymo C?

Kol kas operacijos naudojant C programą atliekamos su eilute/terminale, kuris niekur nesaugomas. Išvestis ištrinama, kai programa uždaroma. Tačiau programinės įrangos pramonėje dauguma programų yra sukurtos saugoti informaciją, gautą iš programos. Failų tvarkymas yra būtent tai, ko reikalauja situacija.



Norėdami suprasti, kodėl failų tvarkymas yra svarbus, pažvelkime į keletą failų naudojimo funkcijų:

  • Pakartotinis naudojimas: Faile saugomus duomenis galima pasiekti, atnaujinti ir ištrinti bet kur ir bet kada, užtikrinant aukštą pakartotinio naudojimo galimybę.
  • Perkeliamumas: Neprarandant jokių duomenų, failus galima perkelti į kitą kompiuterinėje sistemoje. Naudojant šią funkciją sumažinama klaidingo kodavimo rizika.
  • Efektyvus: Kai kurioms programoms gali prireikti daug įvesties. Failų tvarkymas leidžia lengvai pasiekti failo dalį naudojant kelias instrukcijas, o tai sutaupo daug laiko ir sumažina klaidų tikimybę.
  • Saugojimo talpa: Failai leidžia saugoti didelį duomenų kiekį, nesijaudinant, kad programoje viskas bus saugoma vienu metu.

Failų tipai C

Failas gali būti suskirstytas į du tipus, atsižvelgiant į tai, kaip faile saugomi duomenys. Jie yra tokie:

  • Tekstiniai failai
  • Dvejetainiai failai



1. Tekstiniai failai

Tekstiniame faile yra duomenų ASCII simbolių forma ir paprastai naudojamas simbolių srautui saugoti.

  • Kiekviena teksto failo eilutė baigiasi nauju eilutės simboliu („ “).
  • Jį galima skaityti ar rašyti bet kuriuo teksto redaktoriumi.
  • Paprastai jie saugomi kartu su .txt failo plėtinys.
  • Tekstiniai failai taip pat gali būti naudojami šaltinio kodui saugoti.

2. Dvejetainiai failai

Dvejetainiame faile yra duomenų dvejetainė forma (ty 0 ir 1) vietoj ASCII simbolių. Juose yra duomenų, kurie saugomi panašiai kaip ir pagrindinėje atmintyje.

  • Dvejetainius failus galima sukurti tik iš programos, o jų turinį gali skaityti tik programa.
  • Saugesni, nes jie nėra lengvai įskaitomi.
  • Paprastai jie saugomi kartu su .bin failo plėtinys.

C Failų operacijos

C failo operacijos reiškia įvairias galimas operacijas, kurias galime atlikti su C failu, pavyzdžiui:



  1. Sukurti naują failą – fopen() su atributais kaip a arba a+ arba w arba w+
  2. Atidaryti esamą failą - fopen ()
  3. Skaitymas iš failo - fscanf() arba fgets()
  4. Rašymas į failą – fprintf() arba fputs()
  5. Perkėlimas į konkrečią failo vietą – fseek () , atsukti()
  6. Uždaryti failą – fclose ()

Paryškintame tekste minima C funkcija, naudojama failo operacijoms atlikti.

Funkcijos, skirtos C failų operacijoms

failų tvarkymas c

Failų žymeklis C

Failo rodyklė yra nuoroda į tam tikrą vietą atidarytame faile. Jis naudojamas failų tvarkymui atlikti visoms failų operacijoms, tokioms kaip skaitymas, rašymas, uždarymas ir kt. Mes naudojame FAILAS makrokomandą, kad paskelbtumėte failo žymeklio kintamąjį. FILE makrokomanda yra apibrėžta viduje antraštės failą.

Failų žymeklio sintaksė

  FILE*     pointer_name  ;>

Failų žymeklis naudojamas beveik visose failų operacijose C.

Atidarykite failą C

Norėdami atidaryti failą C, fopen () funkcija naudojama su failo pavadinimu arba keliu kartu su reikiamais prieigos režimais.

Fopen() sintaksė

FILE*   fopen  (const char *  file_name  , const char *  access_mode  );>

Parametrai

  • failo pavadinimas : failo pavadinimas, kai jis yra tame pačiame kataloge kaip ir šaltinio failas. Priešingu atveju visas kelias.
  • access_mode: Nurodo, kokiai operacijai failas atidaromas.

Grąžinimo vertė

  • Jei failas atidaromas sėkmingai, grąžina į jį failo žymeklį.
  • Jei failas neatidaromas, grąžina NULL.

Failų atidarymo režimai C

Failų atidarymo režimai arba prieigos režimai nurodo leistinas atidaromo failo operacijas. Jie perduodami kaip argumentas funkcijai fopen (). Kai kurie dažniausiai naudojami failų prieigos režimai yra išvardyti toliau:

Atidarymo režimai apibūdinimas
r Ieško failo. Jei failas atidarytas sėkmingai, fopen( ) įkelia jį į atmintį ir nustato žymeklį, nukreipiantį į pirmąjį jame esantį simbolį. Jei failo atidaryti nepavyksta, fopen( ) grąžina NULL.
rb Atidaryti skaityti dvejetainiu režimu. Jei failo nėra, fopen() grąžina NULL.
Į Atidaryti rašymui teksto režimu. Jei failas egzistuoja, jo turinys perrašomas. Jei failo nėra, sukuriamas naujas failas. Grąžina NULL, jei nepavyksta atidaryti failo.
wb Atidaryti rašymui dvejetainiu režimu. Jei failas egzistuoja, jo turinys perrašomas. Jei failo nėra, jis bus sukurtas.
a Ieško failo. Jei failas atidarytas sėkmingai, fopen( ) įkelia jį į atmintį ir nustato žymeklį, nukreipiantį į paskutinį jame esantį simbolį. Jis atidaromas tik pridėjimo režimu. Jei failo nėra, sukuriamas naujas failas. Grąžina NULL, jei nepavyksta atidaryti failo.
ab Atidaryti pridėti dvejetainiu režimu. Duomenys pridedami prie failo pabaigos. Jei failo nėra, jis bus sukurtas.
r+ Ieško failo. Sėkmingai atidaromas, fopen( ) įkelia jį į atmintį ir nustato žymeklį, nukreipiantį į pirmąjį joje esantį simbolį. Grąžina NULL, jei nepavyksta atidaryti failo.
rb+ Galima skaityti ir rašyti dvejetainiu režimu. Jei failo nėra, fopen() grąžina NULL.
w+ Ieško failo. Jei failas egzistuoja, jo turinys perrašomas. Jei failo nėra, sukuriamas naujas failas. Grąžina NULL, jei nepavyksta atidaryti failo.
wb+ Galima skaityti ir rašyti dvejetainiu režimu. Jei failas egzistuoja, jo turinys perrašomas. Jei failo nėra, jis bus sukurtas.
a+ Ieško failo. Jei failas atidarytas sėkmingai, fopen( ) įkelia jį į atmintį ir nustato žymeklį, nukreipiantį į paskutinį jame esantį simbolį. Jis atidaro failą skaitymo ir pridėjimo režimu. Jei failo nėra, sukuriamas naujas failas. Grąžina NULL, jei nepavyksta atidaryti failo.
ab+ Atidaryti ir skaityti, ir pridėti dvejetainiu režimu. Jei failo nėra, jis bus sukurtas.

Kaip nurodyta pirmiau, jei norite atlikti operacijas su dvejetainiu failu, tada turite pridėti „b“ po paskutinio. Pavyzdžiui, vietoj w turite naudoti wb, vietoj a+ turite naudoti a+b.

Failo atidarymo pavyzdys

C




// C Program to illustrate file opening> #include> #include> int> main()> {> >// file pointer variable to store the value returned by> >// fopen> >FILE>* fptr;> >// opening the file in read mode> >fptr =>fopen>(>'filename.txt'>,>'r'>);> >// checking if the file is opened successfully> >if> (fptr == NULL) {> >printf>(>'The file is not opened. The program will '> >'now exit.'>);> >exit>(0);> >}> >return> 0;> }>

>

>

Išvestis

The file is not opened. The program will now exit.>

Failas neatidaromas, nes šaltinio kataloge jo nėra. Tačiau funkcija fopen () taip pat gali sukurti failą, jei jo nėra. Tai parodyta žemiau

Sukurkite failą C

Funkcija fopen () gali ne tik atidaryti failą, bet ir sukurti failą, jei jo dar nėra. Tam turime naudoti režimus, leidžiančius sukurti failą, jei jo nerasta, pvz., w, w+, wb, wb+, a, a+, ab ir ab+.

FILE *fptr; fptr =   fopen  ('  filename.txt  ', '  w  ');>

Failo atidarymo pavyzdys

C




// C Program to create a file> #include> #include> int> main()> {> >// file pointer> >FILE>* fptr;> >// creating file using fopen() access mode 'w'> >fptr =>fopen>(>'file.txt'>,>'w'>);> >// checking if the file is created> >if> (fptr == NULL) {> >printf>(>'The file is not opened. The program will '> >'exit now'>);> >exit>(0);> >}> >else> {> >printf>(>'The file is created Successfully.'>);> >}> > >return> 0;> }>

>

>

Išvestis

The file is created Successfully.>

Skaitymas iš failo

Failo skaitymo operaciją C programoje galima atlikti naudojant funkcijas fscanf() arba fgets(). Abi funkcijos atliko tas pačias operacijas kaip ir scanf, ir gauna, bet su papildomu parametru – failo žymekliu. Taip pat yra ir kitų funkcijų, kurias galime naudoti norėdami skaityti iš failo. Tokios funkcijos yra išvardytos žemiau:

Funkcija apibūdinimas
fscanf() Norėdami gauti įvestį iš failo, naudokite suformatuotą eilutę ir kintamųjų argumentų sąrašą.
fgets () Įveskite visą eilutę iš failo.
fgetc() Nuskaito vieną simbolį iš failo.
gauti () Skaito skaičių iš failo.
baisus () Nuskaito nurodytus duomenų baitus iš dvejetainio failo.

Taigi, nuo jūsų priklauso, ar norite perskaityti failą eilutę po eilutės ar simbolį po simbolio.

Pavyzdys:

FILE * fptr;  fptr = fopen(fileName.txt, r); fscanf(fptr, '%s %s %s %d', str1, str2, str3, &year); char c = fgetc(fptr);>

Getc() ir kai kurios kitos failų skaitymo funkcijos grąžina EOF (failo pabaigą), kai skaitymo metu pasiekia failo pabaigą. EOF nurodo failo pabaigą, o jo reikšmė yra apibrėžta įgyvendinant.

Pastaba: Čia reikia atkreipti dėmesį į tai, kad perskaičius tam tikrą failo dalį, failo žymeklis bus automatiškai perkeltas į paskutinio skaityto simbolio pabaigą.

Rašyti į failą

Failų rašymo operacijas galima atlikti naudojant fprintf() ir fputs() funkcijas, panašias į skaitymo operacijas. C programavimas taip pat suteikia keletą kitų funkcijų, kurios gali būti naudojamos duomenims įrašyti į failą, pavyzdžiui:

Funkcija apibūdinimas
fprintf() Panašiai kaip printf(), ši funkcija naudoja suformatuotą eilutę ir kintamųjų argumentų sąrašą, kad išspausdintų išvestį į failą.
fputs () Atspausdina visą failo eilutę ir naują eilutę pabaigoje.
fputc() Į failą išspausdinamas vienas simbolis.
fputw() Išspausdina failo numerį.
fwrite () Šios funkcijos į dvejetainį failą įrašo nurodytą baitų kiekį.

Pavyzdys:

FILE *fptr ;  fptr = fopen(fileName.txt, w); fprintf(fptr, '%s %s %s %d', 'We', 'are', 'in', 2012); fputc('a', fptr);>

Failo uždarymas

Funkcija fclose() naudojama failui uždaryti. Po sėkmingų failų operacijų visada turite uždaryti failą, kad pašalintumėte jį iš atminties.

fclose() sintaksė

  fclose  (  file_pointer  );>

kur failo_žymiklis yra atidaryto failo rodyklė.

Pavyzdys:

FILE *fptr ; fptr= fopen(fileName.txt, w); ----------   Some file Operations   ------- fclose(fptr);>

Failų perdavimo pavyzdžiai C

1 pavyzdys: Programa, skirta sukurti failą, įrašyti į jį ir uždaryti failą

C




// C program to Open a File,> // Write in it, And Close the File> #include> #include> int> main()> {> >// Declare the file pointer> >FILE>* filePointer;> >// Get the data to be written in file> >char> dataToBeWritten[50] =>'techcodeview.com-A Computer '> >'Science Portal for Geeks'>;> >// Open the existing file GfgTest.c using fopen()> >// in write mode using 'w' attribute> >filePointer =>fopen>(>'GfgTest.c'>,>'w'>);> >// Check if this filePointer is null> >// which maybe if the file does not exist> >if> (filePointer == NULL) {> >printf>(>'GfgTest.c file failed to open.'>);> >}> >else> {> >printf>(>'The file is now opened. '>);> >// Write the dataToBeWritten into the file> >if> (>strlen>(dataToBeWritten)>0) {> >// writing in the file using fputs()> >fputs>(dataToBeWritten, filePointer);> >fputs>(>' '>, filePointer);> >}> >// Closing the file using fclose()> >fclose>(filePointer);> >printf>(>'Data successfully written in file '> >'GfgTest.c '>);> >printf>(>'The file is now closed.'>);> >}> > >return> 0;> }>

>

>

Išvestis

The file is now opened. Data successfully written in file GfgTest.c The file is now closed.>

Ši programa sukurs failą pavadinimu GfgTest.c tame pačiame kataloge kaip ir šaltinio failas, kuriame bus šis tekstas: techcodeview.com-Kompiuterių mokslo portalas Geeks.

2 pavyzdys: Programa, skirta atidaryti failą, skaityti iš jo ir uždaryti failą

C




// C program to Open a File,> // Read from it, And Close the File> #include> #include> int> main()> {> >// Declare the file pointer> >FILE>* filePointer;> >// Declare the variable for the data to be read from> >// file> >char> dataToBeRead[50];> >// Open the existing file GfgTest.c using fopen()> >// in read mode using 'r' attribute> >filePointer =>fopen>(>'GfgTest.c'>,>'r'>);> >// Check if this filePointer is null> >// which maybe if the file does not exist> >if> (filePointer == NULL) {> >printf>(>'GfgTest.c file failed to open.'>);> >}> >else> {> >printf>(>'The file is now opened. '>);> >// Read the dataToBeRead from the file> >// using fgets() method> >while> (>fgets>(dataToBeRead, 50, filePointer)> >!= NULL) {> >// Print the dataToBeRead> >printf>(>'%s'>, dataToBeRead);> >}> >// Closing the file using fclose()> >fclose>(filePointer);> >printf>(> >'Data successfully read from file GfgTest.c '>);> >printf>(>'The file is now closed.'>);> >}> >return> 0;> }>

>

>

Išvestis

The file is now opened. techcodeview.com-A Computer Science Portal for Geeks Data successfully read from file GfgTest.c The file is now closed.>

Ši programa nuskaito tekstą iš failo pavadinimu GfgTest.c, kurį sukūrėme ankstesniame pavyzdyje, ir išspausdina jį konsolėje.

Skaitykite ir rašykite dvejetainiame faile

Iki šiol aptarėme tik tekstinių failų operacijas. Dvejetainio failo operacijos yra panašios į teksto failo operacijas, tačiau nedaug skiriasi.

Dvejetainio failo atidarymas

Norėdami atidaryti failą dvejetainiu režimu, funkcijoje fopen () naudojame prieigos režimą rb, rb+, ab, ab+, wb ir wb+. Dvejetainiame failo pavadinime taip pat naudojame .bin failo plėtinį.

Pavyzdys

fptr = fopen('filename.bin', 'rb');>

Rašykite į dvejetainį failą

Duomenims į dvejetainį failą įrašyti naudojame funkciją fwrite(). Duomenys įrašomi į dvejetainį failą iš bitų (0 ir 1).

fwrite() sintaksė

size_t   fwrite  (const void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  );>

Parametrai:

  • ptr: žymeklis į įrašomą atminties bloką.
  • dydis: kiekvieno rašomo elemento dydis (baitais).
  • nmemb: elementų skaičius.
  • failo_žymiklis : FILE žymeklis į išvesties failo srautą.

Grąžinimo vertė:

  • Parašytų objektų skaičius.

Pavyzdys: Programa įrašyti į dvejetainį failą naudojant fwrite()

C


poeilutės pavyzdys java



// C program to write to a Binary file using fwrite()> #include> #include> struct> threeNum {> >int> n1, n2, n3;> };> int> main()> {> >int> n;> >// Structure variable declared here.> >struct> threeNum num;> >FILE>* fptr;> >if> ((fptr =>fopen>(>'C:program.bin'>,>'wb'>)) == NULL) {> >printf>(>'Error! opening file'>);> >// If file pointer will return NULL> >// Program will exit.> >exit>(1);> >}> >int> flag = 0;> >// else it will return a pointer to the file.> >for> (n = 1; n <5; ++n) {> >num.n1 = n;> >num.n2 = 5 * n;> >num.n3 = 5 * n + 1;> >flag =>fwrite>(&num,>sizeof>(>struct> threeNum), 1,> >fptr);> >}> >// checking if the data is written> >if> (!flag) {> >printf>(>'Write Operation Failure'>);> >}> >else> {> >printf>(>'Write Operation Successful'>);> >}> >fclose>(fptr);> > >return> 0;> }>

>

>

Išvestis

Write Operation Successful>

Skaitymas iš dvejetainio failo

Funkcija fread() gali būti naudojama duomenims nuskaityti iš dvejetainio failo C kalba. Duomenys iš failo nuskaitomi tokia pačia forma, kokia yra saugomi, ty dvejetaine forma.

fread() sintaksė

size_t   fread  (void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  );>

Parametrai:

  • ptr: žymeklį į atminties bloką, kurį norite skaityti.
  • dydis: kiekvieno nuskaityto elemento dydis (baitais).
  • nmemb: elementų skaičius.
  • failo_žymiklis : FILE žymeklis į įvesties failo srautą.

Grąžinimo vertė:

  • Parašytų objektų skaičius.

Pavyzdys: Programa skaityti iš dvejetainio failo naudojant fread()

C




// C Program to Read from a binary file using fread()> #include> #include> struct> threeNum {> >int> n1, n2, n3;> };> int> main()> {> >int> n;> >struct> threeNum num;> >FILE>* fptr;> >if> ((fptr =>fopen>(>'C:program.bin'>,>'rb'>)) == NULL) {> >printf>(>'Error! opening file'>);> >// If file pointer will return NULL> >// Program will exit.> >exit>(1);> >}> >// else it will return a pointer to the file.> >for> (n = 1; n <5; ++n) {> >fread>(&num,>sizeof>(>struct> threeNum), 1, fptr);> >printf>(>'n1: %d n2: %d n3: %d '>, num.n1, num.n2,> >num.n3);> >}> >fclose>(fptr);> >return> 0;> }>

>

>

Išvestis

n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>

fseek () C

Jei faile turime kelis įrašus ir turime pasiekti konkretų įrašą, esantį konkrečioje vietoje, prieš jį turime peržiūrėti visus įrašus, kad gautume įrašą. Tai darydami sugaišite daug atminties ir darbo laiko. Norėdami sumažinti atminties suvartojimą ir veikimo laiką, galime naudoti fseek () kuri suteikia lengvesnį būdą pasiekti reikiamus duomenis. C funkcija fseek() ieško žymeklio prie nurodyto failo įrašo.

fseek() sintaksė

int fseek(FILE *ptr, long int offset, int pos);>

fseek() pavyzdys

C




// C Program to demonstrate the use of fseek() in C> #include> int> main()> {> >FILE>* fp;> >fp =>fopen>(>'test.txt'>,>'r'>);> >// Moving pointer to end> >fseek>(fp, 0, SEEK_END);> >// Printing position of pointer> >printf>(>'%ld'>,>ftell>(fp));> >return> 0;> }>

>

>

Išvestis

81>

rewind () C

The atsukti() Funkcija naudojama failo žymekliui perkelti į failo pradžią. Jis gali būti naudojamas vietoje fseek(), kai norite failo žymeklio pradžioje.

Atsukimo atgal () sintaksė

  rewind   (  file_pointer  );>

Pavyzdys

C




// C program to illustrate the use of rewind> #include> int> main()> {> >FILE>* fptr;> >fptr =>fopen>(>'file.txt'>,>'w+'>);> >fprintf>(fptr,>'Geeks for Geeks '>);> >// using rewind()> >rewind>(fptr);> >// reading from file> >char> buf[50];> >fscanf>(fptr,>'%[^ ]s'>, buf);> >printf>(>'%s'>, buf);> >return> 0;> }>

>

>

Išvestis

Geeks for Geeks>

Daugiau C failų operacijų funkcijų

Šioje lentelėje išvardytos dar kelios funkcijos, kurios gali būti naudojamos failų operacijoms atlikti arba padėti jas atlikti.

Funkcijos apibūdinimas
fopen () Jis naudojamas failui sukurti arba failui atidaryti.
fclose () Jis naudojamas failo uždarymui.
fgets () Jis naudojamas failo skaitymui.
fprintf() Jis naudojamas duomenų blokams įrašyti į failą.
fscanf() Jis naudojamas duomenų blokams nuskaityti iš failo.
getc () Jis naudojamas norint nuskaityti vieną simbolį į failą.
putc () Jis naudojamas vienam simboliui įrašyti į failą.
fseek () Jis naudojamas failo žymeklio vietai nustatyti į minėtą vietą.
ftell() Jis naudojamas dabartinei failo žymeklio vietai grąžinti.
atsukti() Jis naudojamas failo žymekliui nustatyti į failo pradžią.
putw () Jis naudojamas sveikajam skaičiui įrašyti į failą.
getw () Jis naudojamas nuskaityti sveikąjį skaičių iš failo.