logo

Basisprincipes van bestandsbeheer in C

Het inleveren van bestanden in C is het proces waarin we bewerkingen op een bestand maken, openen, lezen, schrijven en sluiten. C-taal biedt verschillende functies zoals fopen(), fwrite(), fread(), fseek(), fprintf(), etc. om invoer, uitvoer en veel verschillende C-bestandsbewerkingen in ons programma uit te voeren.

Waarom hebben we bestandsverwerking nodig in C?

Tot nu toe worden de bewerkingen met behulp van het C-programma uitgevoerd op een prompt/terminal die nergens is opgeslagen. De uitvoer wordt verwijderd wanneer het programma wordt afgesloten. Maar in de software-industrie worden de meeste programma's geschreven om de informatie op te slaan die uit het programma wordt opgehaald. Het gebruik van dossierbehandeling is precies waar de situatie om vraagt.



Laten we, om te begrijpen waarom het omgaan met bestanden belangrijk is, eens kijken naar een paar kenmerken van het gebruik van bestanden:

  • Herbruikbaarheid: De gegevens die in het bestand zijn opgeslagen, kunnen overal en altijd worden geopend, bijgewerkt en verwijderd, waardoor een hoge mate van herbruikbaarheid wordt geboden.
  • Draagbaarheid: Zonder gegevensverlies kunnen bestanden naar een ander worden overgedragen in het computersysteem. Met deze functie wordt het risico op foutieve codering geminimaliseerd.
  • Efficiënt: Voor sommige programma's kan een grote hoeveelheid invoer nodig zijn. Met bestandsbeheer kunt u met weinig instructies eenvoudig toegang krijgen tot een deel van een bestand, waardoor u veel tijd bespaart en de kans op fouten verkleint.
  • Opslagcapaciteit: Met bestanden kunt u een grote hoeveelheid gegevens opslaan zonder dat u zich zorgen hoeft te maken dat u alles tegelijkertijd in een programma opslaat.

Soorten bestanden in C

Een bestand kan in twee typen worden ingedeeld op basis van de manier waarop het bestand de gegevens opslaat. Ze zijn als volgt:

  • Tekstbestanden
  • Binaire bestanden



1. Tekstbestanden

Een tekstbestand bevat gegevens in de vorm van ASCII-tekens en wordt over het algemeen gebruikt om een ​​stroom tekens op te slaan.

  • Elke regel in een tekstbestand eindigt met een nieuw regelteken (‘ ’).
  • Het kan door elke teksteditor worden gelezen of geschreven.
  • Ze worden over het algemeen opgeslagen bij .tekst bestandsextensie.
  • Tekstbestanden kunnen ook worden gebruikt om de broncode op te slaan.

2. Binaire bestanden

Een binair bestand bevat gegevens in binaire vorm (d.w.z. nullen en enen) in plaats van ASCII-tekens. Ze bevatten gegevens die op dezelfde manier worden opgeslagen als in het hoofdgeheugen.

  • De binaire bestanden kunnen alleen vanuit een programma worden aangemaakt en de inhoud ervan kan alleen door een programma worden gelezen.
  • Veiliger omdat ze niet gemakkelijk leesbaar zijn.
  • Ze worden over het algemeen opgeslagen bij .bin bestandsextensie.

C Bestandsbewerkingen

C-bestandsbewerkingen verwijzen naar de verschillende mogelijke bewerkingen die we kunnen uitvoeren op een bestand in C, zoals:



  1. Een nieuw bestand aanmaken – fopen() met attributen als a of a+ of w of w+
  2. Een bestaand bestand openen – fopen()
  3. Lezen uit bestand – fscanf() of fgets()
  4. Schrijven naar een bestand – fprintf() of fputs()
  5. Naar een specifieke locatie in een bestand gaan – fzoek() , terugspoelen()
  6. Een bestand sluiten – fsluiten()

De gemarkeerde tekst vermeldt de C-functie die wordt gebruikt om de bestandsbewerkingen uit te voeren.

Functies voor C-bestandsbewerkingen

dossierbehandeling in c

Bestandsaanwijzer in C

Een file pointer is een verwijzing naar een bepaalde positie in het geopende bestand. Het wordt gebruikt bij het verwerken van bestanden om alle bestandsbewerkingen uit te voeren, zoals lezen, schrijven, sluiten, enz. We gebruiken de BESTAND macro om de bestandsaanwijzervariabele te declareren. De FILE-macro wordt binnenin gedefinieerd header-bestand.

Syntaxis van bestandsaanwijzer

  FILE*     pointer_name  ;>

File Pointer wordt gebruikt bij bijna alle bestandsbewerkingen in C.

Open een bestand in C

Voor het openen van een bestand in C moet de fopen() functie wordt gebruikt met de bestandsnaam of het bestandspad samen met de vereiste toegangsmodi.

Syntaxis van fopen()

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

Parameters

  • bestandsnaam : naam van het bestand indien aanwezig in dezelfde map als het bronbestand. Anders het volledige pad.
  • toegangsmodus: Specificeert voor welke bewerking het bestand wordt geopend.

Winstwaarde

  • Als het bestand met succes wordt geopend, wordt er een bestandsverwijzing naar het bestand geretourneerd.
  • Als het bestand niet wordt geopend, wordt NULL geretourneerd.

Bestandsopeningsmodi in C

Bestandsopeningsmodi of toegangsmodi specificeren de toegestane bewerkingen op het te openen bestand. Ze worden als argument doorgegeven aan de functie fopen(). Hieronder vindt u enkele veelgebruikte bestandstoegangsmodi:

Openingsmodi Beschrijving
R Zoekt bestand. Als het bestand succesvol is geopend, laadt fopen( ) het in het geheugen en stelt een pointer in die naar het eerste teken erin wijst. Als het bestand niet kan worden geopend, retourneert fopen( ) NULL.
rb Open voor lezen in binaire modus. Als het bestand niet bestaat, retourneert fopen( ) NULL.
In Open voor schrijven in tekstmodus. Als het bestand bestaat, wordt de inhoud ervan overschreven. Als het bestand niet bestaat, wordt er een nieuw bestand gemaakt. Retourneert NULL als het bestand niet kan worden geopend.
wb Open voor schrijven in binaire modus. Als het bestand bestaat, wordt de inhoud ervan overschreven. Als het bestand niet bestaat, wordt het aangemaakt.
A Zoekt bestand. Als het bestand succesvol is geopend, laadt fopen( ) het in het geheugen en stelt een pointer in die naar het laatste teken erin verwijst. Het wordt alleen geopend in de toevoegmodus. Als het bestand niet bestaat, wordt er een nieuw bestand gemaakt. Retourneert NULL als het bestand niet kan worden geopend.
ab Openen voor toevoegen in binaire modus. Gegevens worden aan het einde van het bestand toegevoegd. Als het bestand niet bestaat, wordt het aangemaakt.
r+ Zoekt bestand. Het wordt met succes geopend. Fopen( ) laadt het in het geheugen en stelt een pointer in die naar het eerste teken erin wijst. Retourneert NULL als het bestand niet kan worden geopend.
rb+ Open voor zowel lezen als schrijven in binaire modus. Als het bestand niet bestaat, retourneert fopen( ) NULL.
w+ Zoekt bestand. Als het bestand bestaat, wordt de inhoud ervan overschreven. Als het bestand niet bestaat, wordt er een nieuw bestand gemaakt. Retourneert NULL als het bestand niet kan worden geopend.
wb+ Open voor zowel lezen als schrijven in binaire modus. Als het bestand bestaat, wordt de inhoud ervan overschreven. Als het bestand niet bestaat, wordt het aangemaakt.
een+ Zoekt bestand. Als het bestand succesvol is geopend, laadt fopen( ) het in het geheugen en stelt een pointer in die naar het laatste teken erin verwijst. Het opent het bestand zowel in de lees- als in de toevoegmodus. Als het bestand niet bestaat, wordt er een nieuw bestand gemaakt. Retourneert NULL als het bestand niet kan worden geopend.
ab+ Open voor zowel lezen als toevoegen in binaire modus. Als het bestand niet bestaat, wordt het aangemaakt.

Zoals hierboven aangegeven, moet je, als je bewerkingen op een binair bestand wilt uitvoeren, op het laatst ‘b’ toevoegen. In plaats van w moet u bijvoorbeeld wb gebruiken, in plaats van a+ moet u a+b gebruiken.

Voorbeeld van het openen van een bestand

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;> }>

>

>

Uitvoer

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

Het bestand wordt niet geopend omdat het niet bestaat in de bronmap. Maar de functie fopen() kan ook een bestand maken als het niet bestaat. Het wordt hieronder weergegeven

Maak een bestand in C

De functie fopen() kan niet alleen een bestand openen, maar kan ook een bestand maken als dit nog niet bestaat. Daarvoor moeten we de modi gebruiken waarmee een bestand kan worden aangemaakt als het niet wordt gevonden, zoals w, w+, wb, wb+, a, a+, ab en ab+.

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

Voorbeeld van het openen van een bestand

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;> }>

>

>

Uitvoer

The file is created Successfully.>

Lezen uit een bestand

De bestandsleesbewerking in C kan worden uitgevoerd met behulp van de functies fscanf() of fgets(). Beide functies voerden dezelfde bewerkingen uit als die van scanf en get, maar met een extra parameter, de bestandsaanwijzer. Er zijn ook andere functies die we kunnen gebruiken om uit een bestand te lezen. Dergelijke functies worden hieronder vermeld:

Functie Beschrijving
fscanf() Gebruik een opgemaakte tekenreeks en een lijst met variabele argumenten om invoer uit een bestand te halen.
fgets() Voer de hele regel uit het bestand in.
fgetc() Leest één teken uit het bestand.
krijgen() Leest een nummer uit een bestand.
angst() Leest de opgegeven bytes aan gegevens uit een binair bestand.

Het hangt dus van jou af of je het bestand regel voor regel of teken voor teken wilt lezen.

Voorbeeld:

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

De getc() en enkele andere functies voor het lezen van bestanden retourneren EOF (End Of File) wanneer ze tijdens het lezen het einde van het bestand bereiken. EOF geeft het einde van het bestand aan en de waarde ervan is door de implementatie gedefinieerd.

Opmerking: Eén ding om op te merken is dat na het lezen van een bepaald deel van het bestand, de bestandsaanwijzer automatisch naar het einde van het laatst gelezen teken wordt verplaatst.

Schrijf naar een bestand

De bestandsschrijfbewerkingen kunnen worden uitgevoerd door de functies fprintf() en fputs() met overeenkomsten met leesbewerkingen. C-programmeren biedt ook enkele andere functies die kunnen worden gebruikt om gegevens naar een bestand te schrijven, zoals:

Functie Beschrijving
fprintf() Net als bij printf(), gebruikt deze functie een opgemaakte string en een lijst met variabelenargumenten om de uitvoer naar het bestand af te drukken.
fputs() Drukt de hele regel in het bestand af en een nieuwe regel aan het einde.
fputc() Drukt één teken af ​​in het bestand.
fputw() Drukt een nummer af naar het bestand.
fschrijven() Deze functie schrijft het opgegeven aantal bytes naar het binaire bestand.

Voorbeeld:

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

Een bestand sluiten

De functie fclose() wordt gebruikt om het bestand te sluiten. Na succesvolle bestandsbewerkingen moet u een bestand altijd sluiten om het uit het geheugen te verwijderen.

Syntaxis van fclose()

  fclose  (  file_pointer  );>

waar de bestands_pointer is de verwijzing naar het geopende bestand.

Voorbeeld:

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

Voorbeelden van het inleveren van bestanden C

Voorbeeld 1: Programma om een ​​bestand te maken, erin te schrijven en het bestand te sluiten

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;> }>

>

>

Uitvoer

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

Dit programma maakt een bestand met de naam GfgTest.c in dezelfde map als het bronbestand, dat de volgende tekst bevat: techcodeview.com-A Computer Science Portal for Geeks.

Voorbeeld 2: Programma om een ​​bestand te openen, ervan te lezen en het bestand te sluiten

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;> }>

>

>

Uitvoer

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.>

Dit programma leest de tekst uit het bestand met de naam GfgTest.c dat we in het vorige voorbeeld hebben gemaakt en drukt deze af in de console.

Lezen en schrijven in een binair bestand

Tot nu toe hebben we alleen tekstbestandsbewerkingen besproken. De bewerkingen op een binair bestand zijn vergelijkbaar met bewerkingen in tekstbestanden, met weinig verschil.

Een binair bestand openen

Om een ​​bestand in binaire modus te openen, gebruiken we de toegangsmodi rb, rb+, ab, ab+, wb en wb+ in de functie fopen(). We gebruiken ook de bestandsextensie .bin in de binaire bestandsnaam.

Voorbeeld

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

Schrijf naar een binair bestand

We gebruiken de functie fwrite() om gegevens naar een binair bestand te schrijven. De gegevens worden naar het binaire bestand geschreven in de vorm van bits (nullen en enen).

Syntaxis van fwrite()

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

Parameters:

  • ptr: verwijzing naar het geheugenblok dat moet worden geschreven.
  • maat: grootte van elk te schrijven element (in bytes).
  • nmemb: aantal elementen.
  • bestands_pointer : FILE-aanwijzer naar de uitvoerbestandsstroom.

Winstwaarde:

  • Aantal geschreven objecten.

Voorbeeld: Programma om naar een binair bestand te schrijven met fwrite()

C




// 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;> }>

>

>

Uitvoer

Write Operation Successful>

Lezen uit binair bestand

De functie fread() kan worden gebruikt om gegevens uit een binair bestand in C te lezen. De gegevens worden uit het bestand gelezen in dezelfde vorm als waarin ze zijn opgeslagen, d.w.z. in binaire vorm.

Syntaxis van fread()

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

Parameters:

  • ptr: verwijzing naar het geheugenblok dat moet worden gelezen.
  • maat: de grootte van elk te lezen element (in bytes).
  • nmemb: aantal elementen.
  • bestands_pointer : FILE-aanwijzer naar de invoerbestandsstroom.

Winstwaarde:

  • Aantal geschreven objecten.

Voorbeeld: Programma om uit een binair bestand te lezen met behulp van 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;> }>

>

>

Uitvoer

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() in C

Als we meerdere records in een bestand hebben en toegang moeten krijgen tot een bepaald record dat zich op een specifieke positie bevindt, moeten we alle records doorlopen om het record te verkrijgen. Als u dit doet, verspilt u veel geheugen en operationele tijd. Om het geheugenverbruik en de operationele tijd te verminderen, kunnen we gebruiken fzoek() waardoor u gemakkelijker bij de vereiste gegevens kunt komen. De functie fseek() in C zoekt de cursor naar het gegeven record in het bestand.

Syntaxis voor fseek()

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

Voorbeeld van fseek()

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;> }>

>

>

Uitvoer

81>

terugspoelen() in C

De terugspoelen() functie wordt gebruikt om de bestandsaanwijzer naar het begin van het bestand te brengen. Het kan worden gebruikt in plaats van fseek() als u de bestandsaanwijzer aan het begin wilt hebben.

Syntaxis van terugspoelen()

  rewind   (  file_pointer  );>

Voorbeeld

C


zaden versus sporen



// 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;> }>

>

>

Uitvoer

Geeks for Geeks>

Meer functies voor C-bestandsbewerkingen

De volgende tabel bevat nog enkele functies die kunnen worden gebruikt om bestandsbewerkingen uit te voeren of om daarbij te helpen.

Functies Beschrijving
fopen() Het wordt gebruikt om een ​​bestand te maken of een bestand te openen.
fsluiten() Het wordt gebruikt om een ​​bestand te sluiten.
fgets() Het wordt gebruikt om een ​​bestand te lezen.
fprintf() Het wordt gebruikt om gegevensblokken naar een bestand te schrijven.
fscanf() Het wordt gebruikt om gegevensblokken uit een bestand te lezen.
getc() Het wordt gebruikt om één teken in een bestand te lezen.
putc() Het wordt gebruikt om één teken naar een bestand te schrijven.
fzoek() Het wordt gebruikt om de positie van een bestandsaanwijzer naar een genoemde locatie in te stellen.
ftell() Het wordt gebruikt om de huidige positie van een bestandsaanwijzer terug te geven.
terugspoelen() Het wordt gebruikt om de bestandsaanwijzer naar het begin van een bestand te plaatsen.
putw() Het wordt gebruikt om een ​​geheel getal naar een bestand te schrijven.
krijg() Het wordt gebruikt om een ​​geheel getal uit een bestand te lezen.