Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

C Bestandsverwerking

C Bestandsverwerking

In deze tutorial leer je over bestandsafhandeling in C. Je leert standaard I/O in C af te handelen met fprintf(), fscanf(), fread(), fwrite(), fseek() etc. met behulp van voorbeelden.

Een bestand is een container in computeropslagapparaten die worden gebruikt voor het opslaan van gegevens.


Waarom zijn bestanden nodig?

  • Als een programma wordt beëindigd, gaan alle gegevens verloren. Door op te slaan in een bestand blijven uw gegevens behouden, zelfs als het programma wordt beëindigd.
  • Als u een groot aantal gegevens moet invoeren, kost het veel tijd om ze allemaal in te voeren.
    Als u echter een bestand heeft dat alle gegevens bevat, kunt u eenvoudig toegang krijgen tot de inhoud van het bestand met een paar commando's in C.
  • U kunt uw gegevens gemakkelijk en zonder wijzigingen van de ene computer naar de andere verplaatsen.

Typen bestanden

Als je met bestanden omgaat, zijn er twee soorten bestanden die je moet kennen:

  1. Tekstbestanden
  2. Binaire bestanden

1. Tekstbestanden

Tekstbestanden zijn de normale .txt bestanden. U kunt eenvoudig tekstbestanden maken met behulp van eenvoudige teksteditors zoals Kladblok.

Wanneer u die bestanden opent, ziet u alle inhoud in het bestand als platte tekst. U kunt de inhoud eenvoudig bewerken of verwijderen.

Ze kosten een minimum aan onderhoud, zijn gemakkelijk leesbaar, bieden de minste beveiliging en nemen meer opslagruimte in beslag.

2. Binaire bestanden

Binaire bestanden zijn meestal de .bin bestanden op uw computer.

In plaats van gegevens in platte tekst op te slaan, slaan ze deze op in de binaire vorm (0-en en 1-en).

Ze kunnen een grotere hoeveelheid gegevens bevatten, zijn niet gemakkelijk leesbaar en bieden een betere beveiliging dan tekstbestanden.


Bestandsbewerkingen

In C kunt u vier belangrijke bewerkingen op bestanden uitvoeren, tekst of binair:

  1. Een nieuw bestand maken
  2. Een bestaand bestand openen
  3. Een bestand sluiten
  4. Lezen van en schrijven van informatie naar een bestand

Werken met bestanden

Wanneer u met bestanden werkt, moet u een pointer van het type bestand declareren. Deze verklaring is nodig voor de communicatie tussen het bestand en het programma.

FILE *fptr;

Een bestand openen - om te maken en te bewerken

Het openen van een bestand wordt uitgevoerd met de fopen() functie gedefinieerd in de stdio.h header-bestand.

De syntaxis voor het openen van een bestand in standaard I/O is:

ptr = fopen("fileopen","mode");

Bijvoorbeeld,

fopen("E:\\cprogram\\newprogram.txt","w");

fopen("E:\\cprogram\\oldprogram.bin","rb");
  • Laten we aannemen dat het bestand newprogram.txt bestaat niet in de locatie E:\cprogram . De eerste functie maakt een nieuw bestand aan met de naam newprogram.txt en opent het om te schrijven volgens de modus 'w' .
    In de schrijfmodus kunt u de inhoud van het bestand maken en bewerken (overschrijven).
  • Laten we nu aannemen dat het tweede binaire bestand oldprogram.bin bestaat in de locatie E:\cprogram . De tweede functie opent het bestaande bestand om in binaire modus te lezen 'rb' .
    In de leesmodus kunt u alleen het bestand lezen, u kunt niet in het bestand schrijven.
Openingsmodi in standaard I/O
Modus Betekenis van modus Tijdens het ontbreken van een bestand
r Geopend om te lezen. Als het bestand niet bestaat, fopen() geeft NULL terug.
rb Open voor lezen in binaire modus. Als het bestand niet bestaat, fopen() geeft NULL terug.
w Open voor schrijven. Als het bestand bestaat, wordt de inhoud ervan overschreven.
Als het bestand niet bestaat, wordt het aangemaakt.
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 Open voor toevoegen.
Gegevens worden aan het einde van het bestand toegevoegd.
Als het bestand niet bestaat, wordt het aangemaakt.
ab Open voor toevoegen in binaire modus.
Gegevens worden aan het einde van het bestand toegevoegd.
Als het bestand niet bestaat, wordt het aangemaakt.
r+ Open voor zowel lezen als schrijven. Als het bestand niet bestaat, fopen() geeft NULL terug.
rb+ Open voor zowel lezen als schrijven in binaire modus. Als het bestand niet bestaat, fopen() geeft NULL terug.
w+ Open voor zowel lezen als schrijven. Als het bestand bestaat, wordt de inhoud ervan overschreven.
Als het bestand niet bestaat, wordt het aangemaakt.
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.
a+ Open voor zowel lezen als toevoegen. Als het bestand niet bestaat, wordt het aangemaakt.
ab+ Open voor zowel lezen als toevoegen in binaire modus. Als het bestand niet bestaat, wordt het aangemaakt.

Een bestand sluiten

Het bestand (zowel tekst als binair) moet na het lezen/schrijven worden gesloten.

Het sluiten van een bestand wordt uitgevoerd met de fclose() functie.

fclose(fptr);

Hier, fptr is een bestandsaanwijzer die is gekoppeld aan het te sluiten bestand.


Lezen en schrijven naar een tekstbestand

Voor het lezen en schrijven naar een tekstbestand gebruiken we de functies fprintf() en fscanf().

Het zijn slechts de bestandsversies van printf() en scanf() . Het enige verschil is dat fprintf() en fscanf() verwacht een verwijzing naar de structuur FILE.


Voorbeeld 1:Schrijf naar een tekstbestand

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   // use appropriate location if you are using MacOS or Linux
   fptr = fopen("C:\\program.txt","w");

   if(fptr == NULL)
   {
      printf("Error!");   
      exit(1);             
   }

   printf("Enter num: ");
   scanf("%d",&num);

   fprintf(fptr,"%d",num);
   fclose(fptr);

   return 0;
}

Dit programma neemt een nummer van de gebruiker en slaat het op in het bestand program.txt .

Nadat u dit programma hebt gecompileerd en uitgevoerd, ziet u een tekstbestand program.txt gemaakt in de C-schijf van uw computer. Als je het bestand opent, kun je het gehele getal zien dat je hebt ingevoerd.


Voorbeeld 2:Lezen uit een tekstbestand

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.txt","r")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   fscanf(fptr,"%d", &num);

   printf("Value of n=%d", num);
   fclose(fptr); 
  
   return 0;
}

Dit programma leest het gehele getal dat aanwezig is in de program.txt bestand en drukt het af op het scherm.

Als u het bestand van Voorbeeld 1 . hebt gemaakt , zal het uitvoeren van dit programma je het gehele getal opleveren dat je hebt ingevoerd.

Andere functies zoals fgetchar() , fputc() enz. kunnen op een vergelijkbare manier worden gebruikt.


Lezen en schrijven naar een binair bestand

Functies fread() en fwrite() worden gebruikt voor het lezen van en schrijven naar een bestand op de schijf, respectievelijk in het geval van binaire bestanden.


Schrijven naar een binair bestand

Om naar een binair bestand te schrijven, moet u de fwrite() . gebruiken functie. De functies hebben vier argumenten:

  1. adres van gegevens die naar de schijf moeten worden geschreven
  2. grootte van gegevens die naar de schijf moeten worden geschreven
  3. aantal van dit soort gegevens
  4. verwijs naar het bestand waarin u wilt schrijven.
fwrite(addressData, sizeData, numbersData, pointerToFile);

Voorbeeld 3:Schrijf naar een binair bestand met fwrite()

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      num.n1 = n;
      num.n2 = 5*n;
      num.n3 = 5*n + 1;
      fwrite(&num, sizeof(struct threeNum), 1, fptr); 
   }
   fclose(fptr); 
  
   return 0;
}

In dit programma maken we een nieuw bestand program.bin in de C-schijf.

We declareren een structuur threeNum met drie cijfers - n1, n2 en n3 , en definieer het in de hoofdfunctie als num.

Nu, binnen de for-lus, slaan we de waarde op in het bestand met behulp van fwrite() .

De eerste parameter krijgt het adres num en de tweede parameter heeft de grootte van de structuur threeNum .

Aangezien we slechts één instantie van num . invoegen , de derde parameter is 1 . En de laatste parameter *fptr verwijst naar het bestand waarin we de gegevens opslaan.

Ten slotte sluiten we het bestand.


Lezen uit een binair bestand

Functie fread() neem ook 4 argumenten gelijk aan de fwrite() functioneren zoals hierboven.

fread(addressData, sizeData, numbersData, pointerToFile);

Voorbeeld 4:Lezen uit een binair bestand met fread()

#include <stdio.h>
#include <stdlib.h>

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");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

In dit programma lees je hetzelfde bestand program.bin en loop een voor een door de records.

In eenvoudige bewoordingen lees je een threeNum record van threeNum grootte uit het bestand waarnaar wordt verwezen door *fptr in de structuur num .

U krijgt dezelfde records als in Voorbeeld 3 .


Gegevens ophalen met fseek()

Als u veel records in een bestand hebt en een record op een specifieke positie moet openen, moet u eerst alle records doorlopen om het record te krijgen.

Dit zal veel geheugen en bedieningstijd verspillen. Een gemakkelijkere manier om bij de vereiste gegevens te komen, kan worden bereikt met fseek() .

Zoals de naam al doet vermoeden, fseek() zoekt de cursor naar het gegeven record in het bestand.


Syntaxis van fseek()

fseek(FILE * stream, long int offset, int whence);

De eerste parameterstroom is de aanwijzer naar het bestand. De tweede parameter is de positie van het te vinden record en de derde parameter specificeert de locatie waar de offset begint.

Verschillend vanwaar in fseek()
Vanwaar Betekenis
SEEK_SET Start de offset vanaf het begin van het bestand.
SEEK_END Start de offset vanaf het einde van het bestand.
SEEK_CUR Start de offset vanaf de huidige locatie van de cursor in het bestand.

Voorbeeld 5:fseek()

#include <stdio.h>
#include <stdlib.h>

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");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }
   
   // Moves the cursor to the end of the file
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
      fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
   }
   fclose(fptr); 
  
   return 0;
}

Dit programma zal beginnen met het lezen van de records uit het bestand program.bin in omgekeerde volgorde (laatste naar eerste) en drukt het af.


C Taal

  1. Java-bestandsklasse
  2. Een inleiding tot STL-bestanden
  3. Verilog File IO-bewerkingen
  4. C - Bestand I/O
  5. C - Koptekstbestanden
  6. C - Foutafhandeling
  7. C++-bestanden en -streams
  8. C++ Signaalverwerking
  9. C# - Afhandeling van uitzonderingen
  10. C# - Bestand I/O
  11. Python - Bestanden I/O