logo

Conceptes bàsics del maneig de fitxers en C

L'entrega de fitxers en C és el procés en què creem, obrim, llegim, escrivim i tanquem operacions en un fitxer. El llenguatge C ofereix diferents funcions com ara fopen(), fwrite(), fread(), fseek(), fprintf(), etc. per dur a terme l'entrada, la sortida i moltes operacions diferents de fitxers C al nostre programa.

Per què necessitem la gestió de fitxers en C?

Fins ara, les operacions amb el programa C es fan en un indicador/terminal que no s'emmagatzema enlloc. La sortida s'elimina quan es tanca el programa. Però a la indústria del programari, la majoria dels programes s'escriuen per emmagatzemar la informació obtinguda del programa. L'ús de la gestió de fitxers és exactament el que demana la situació.



Per entendre per què és important el maneig de fitxers, vegem algunes característiques de l'ús de fitxers:

  • Reutilitzabilitat: Les dades emmagatzemades al fitxer es poden accedir, actualitzar i suprimir en qualsevol lloc i en qualsevol moment, proporcionant una gran reutilització.
  • Portabilitat: Sense perdre cap dada, els fitxers es poden transferir a un altre en el sistema informàtic. El risc de codificació defectuosa es minimitza amb aquesta funció.
  • Eficient: Pot ser que es requereixi una gran quantitat d'entrada per a alguns programes. El maneig de fitxers us permet accedir fàcilment a una part d'un fitxer mitjançant poques instruccions, la qual cosa estalvia molt de temps i redueix la possibilitat d'errors.
  • Capacitat d'emmagatzematge: Els fitxers us permeten emmagatzemar una gran quantitat de dades sense haver de preocupar-vos d'emmagatzemar-ho tot simultàniament en un programa.

Tipus de fitxers en C

Un fitxer es pot classificar en dos tipus segons la forma en què el fitxer emmagatzema les dades. Són els següents:

  • Fitxers de text
  • Fitxers binaris



1. Fitxers de text

Un fitxer de text conté dades al fitxer forma de caràcters ASCII i s'utilitza generalment per emmagatzemar un flux de caràcters.

  • Cada línia d'un fitxer de text acaba amb un caràcter de línia nova (' ').
  • Pot ser llegit o escrit per qualsevol editor de text.
  • Generalment s'emmagatzemen amb .txt extensió de fitxer.
  • Els fitxers de text també es poden utilitzar per emmagatzemar el codi font.

2. Fitxers binaris

Un fitxer binari conté dades a forma binària (és a dir, 0 i 1) en lloc de caràcters ASCII. Contenen dades que s'emmagatzemen de manera similar a com s'emmagatzemen a la memòria principal.

  • Els fitxers binaris només es poden crear des d'un programa i el seu contingut només pot ser llegit per un programa.
  • Més segurs ja que no són fàcilment llegibles.
  • Generalment s'emmagatzemen amb .bin extensió de fitxer.

C Operacions amb fitxers

Les operacions amb fitxers C fan referència a les diferents operacions possibles que podem realitzar en un fitxer en C com ara:



  1. Creació d'un fitxer nou - fopen() amb atributs com a o a+ o w o w+
  2. Obrir un fitxer existent - fopen()
  3. Llegint des del fitxer - fscanf() o fgets()
  4. Escriure en un fitxer - fprintf() o fputs()
  5. Moure's a una ubicació específica en un fitxer: fseek() , rebobina ()
  6. Tancar un fitxer - fclose()

El text ressaltat esmenta la funció C que s'utilitza per realitzar les operacions del fitxer.

Funcions per a operacions de fitxers C

gestió d'arxius al c

Punter de fitxer en C

Un punter de fitxer és una referència a una posició concreta del fitxer obert. S'utilitza en el maneig de fitxers per realitzar totes les operacions de fitxers com ara llegir, escriure, tancar, etc. Utilitzem el DOSSIER macro per declarar la variable punter del fitxer. La macro FILE es defineix dins fitxer de capçalera.

Sintaxi de File Pointer

  FILE*     pointer_name  ;>

File Pointer s'utilitza en gairebé totes les operacions de fitxers a C.

Obriu un fitxer en C

Per obrir un fitxer en C, el fopen() La funció s'utilitza amb el nom del fitxer o la ruta del fitxer juntament amb els modes d'accés necessaris.

Sintaxi de fopen()

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

Paràmetres

  • nom de l'arxiu : nom del fitxer quan es troba al mateix directori que el fitxer font. En cas contrari, camí complet.
  • mode_accés: Especifica per a quina operació s'obre el fitxer.

Valor de retorn

  • Si el fitxer s'obre correctament, hi retorna un punter de fitxer.
  • Si el fitxer no s'obre, retorna NULL.

Modes d'obertura de fitxers en C

Els modes d'obertura de fitxers o els modes d'accés especifiquen les operacions permeses sobre el fitxer que s'ha d'obrir. Es passen com a argument a la funció fopen(). A continuació s'enumeren alguns dels modes d'accés a fitxers utilitzats habitualment:

Modes d'obertura Descripció
r Fitxer de cerca. Si el fitxer s'obre correctament, fopen() el carrega a la memòria i configura un punter que apunta al primer caràcter que hi ha. Si el fitxer no es pot obrir fopen() retorna NULL.
rb Obert per llegir en mode binari. Si el fitxer no existeix, fopen() retorna NULL.
En Obre per escriure en mode text. Si el fitxer existeix, el seu contingut se sobreescriu. Si el fitxer no existeix, es crea un fitxer nou. Retorna NULL, si no es pot obrir el fitxer.
wb Obert per escriure en mode binari. Si el fitxer existeix, el seu contingut se sobreescriu. Si el fitxer no existeix, es crearà.
a Fitxer de cerca. Si el fitxer s'obre correctament, fopen() el carrega a la memòria i configura un punter que apunta a l'últim caràcter que hi ha. Només s'obre en el mode d'afegir. Si el fitxer no existeix, es crea un fitxer nou. Retorna NULL, si no es pot obrir el fitxer.
ab Obriu per afegir en mode binari. Les dades s'afegeixen al final del fitxer. Si el fitxer no existeix, es crearà.
r+ Fitxer de cerca. S'obre amb èxit fopen() el carrega a la memòria i configura un punter que apunta al primer caràcter. Retorna NULL, si no es pot obrir el fitxer.
rb+ Obert tant per llegir com per escriure en mode binari. Si el fitxer no existeix, fopen() retorna NULL.
w+ Fitxer de cerca. Si el fitxer existeix, el seu contingut se sobreescriu. Si el fitxer no existeix, es crea un fitxer nou. Retorna NULL, si no es pot obrir el fitxer.
wb+ Obert tant per llegir com per escriure en mode binari. Si el fitxer existeix, el seu contingut se sobreescriu. Si el fitxer no existeix, es crearà.
a+ Fitxer de cerca. Si el fitxer s'obre correctament, fopen() el carrega a la memòria i configura un punter que apunta a l'últim caràcter que hi ha. Obre el fitxer tant en mode de lectura com d'adjuntar. Si el fitxer no existeix, es crea un fitxer nou. Retorna NULL, si no es pot obrir el fitxer.
ab+ Obert tant per llegir com per afegir en mode binari. Si el fitxer no existeix, es crearà.

Tal com s'ha indicat anteriorment, si voleu realitzar operacions en un fitxer binari, heu d'afegir 'b' al final. Per exemple, en comptes de w, heu d'utilitzar wb, en comptes de a+ heu d'utilitzar a+b.

Exemple d'obertura d'un fitxer

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

>

>

Sortida

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

El fitxer no s'obre perquè no existeix al directori font. Però la funció fopen() també és capaç de crear un fitxer si no existeix. Es mostra a continuació

Creeu un fitxer en C

La funció fopen() no només pot obrir un fitxer sinó que també pot crear un fitxer si encara no existeix. Per a això, hem d'utilitzar els modes que permeten la creació d'un fitxer si no es troba com ara w, w+, wb, wb+, a, a+, ab i ab+.

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

Exemple d'obertura d'un fitxer

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

>

>

Sortida

La cadena de Java està buida
The file is created Successfully.>

Lectura d'un fitxer

L'operació de lectura de fitxers en C es pot realitzar mitjançant les funcions fscanf() o fgets(). Ambdues funcions van realitzar les mateixes operacions que la de scanf i obté però amb un paràmetre addicional, el punter de fitxer. També hi ha altres funcions que podem utilitzar per llegir des d'un fitxer. Aquestes funcions s'enumeren a continuació:

Funció Descripció
fscanf() Utilitzeu una cadena formatada i una llista d'arguments variables per prendre entrada d'un fitxer.
fgets() Introduïu tota la línia del fitxer.
fgetc() Llegeix un sol caràcter del fitxer.
aconseguir() Llegeix un número d'un fitxer.
fread () Llegeix els bytes de dades especificats d'un fitxer binari.

Per tant, depèn de vosaltres si voleu llegir el fitxer línia per línia o caràcter per caràcter.

Exemple:

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

El getc() i algunes altres funcions de lectura de fitxers retornen EOF (Fi del fitxer) quan arriben al final del fitxer mentre llegeixen. EOF indica el final del fitxer i el seu valor està definit per la implementació.

Nota: Una cosa a tenir en compte aquí és que després de llegir una part concreta del fitxer, el punter del fitxer es mourà automàticament al final de l'últim caràcter llegit.

Escriure en un fitxer

Les operacions d'escriptura de fitxers es poden realitzar mitjançant les funcions fprintf() i fputs() amb semblances a les operacions de lectura. La programació en C també ofereix algunes altres funcions que es poden utilitzar per escriure dades en un fitxer, com ara:

Funció Descripció
fprintf() De manera semblant a printf(), aquesta funció utilitza una cadena formatada i una llista d'arguments variables per imprimir la sortida al fitxer.
fputs() Imprimeix tota la línia al fitxer i una nova línia al final.
fputc() Imprimeix un sol caràcter al fitxer.
fputw() Imprimeix un número al fitxer.
fwrite() Aquesta funció escriu la quantitat especificada de bytes al fitxer binari.

Exemple:

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

Tancant un fitxer

La funció fclose() s'utilitza per tancar el fitxer. Després d'executar les operacions de fitxers amb èxit, sempre heu de tancar un fitxer per eliminar-lo de la memòria.

Sintaxi de fclose()

  fclose  (  file_pointer  );>

ón el punter_fitxer és el punter al fitxer obert.

Exemple:

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

Exemples de lliurament de fitxers en C

Exemple 1: Programa per crear un fitxer, escriure-hi i tancar-lo

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

>

llançar cadena a int

>

Sortida

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

Aquest programa crearà un fitxer anomenat GfgTest.c al mateix directori que el fitxer font que contindrà el text següent: techcodeview.com-A Computer Science Portal for Geeks.

Exemple 2: Programa per obrir un fitxer, llegir-lo i tancar-lo

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

>

>

Sortida

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

Aquest programa llegeix el text del fitxer anomenat GfgTest.c que vam crear a l'exemple anterior i l'imprimeix a la consola.

Llegir i escriure en un fitxer binari

Fins ara, només hem parlat de les operacions de fitxers de text. Les operacions en un fitxer binari són similars a les operacions amb fitxers de text amb poca diferència.

Obertura d'un fitxer binari

Per obrir un fitxer en mode binari, utilitzem el mode d'accés rb, rb+, ab, ab+, wb i wb+ a la funció fopen(). També fem servir l'extensió de fitxer .bin al nom de fitxer binari.

Exemple

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

Escriu en un fitxer binari

Utilitzem la funció fwrite() per escriure dades en un fitxer binari. Les dades s'escriuen al fitxer binari al des de bits (0 i 1).

Sintaxi de fwrite()

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

Paràmetres:

  • ptr: punter al bloc de memòria que s'ha d'escriure.
  • mida: mida de cada element a escriure (en bytes).
  • nmemb: nombre d'elements.
  • punter_fitxer : FILE punter al flux del fitxer de sortida.

Valor de retorn:

  • Nombre d'objectes escrits.

Exemple: Programa per escriure en un fitxer binari mitjançant 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;> }>

>

>

Sortida

Write Operation Successful>

Lectura d'un fitxer binari

La funció fread() es pot utilitzar per llegir dades d'un fitxer binari en C. Les dades es llegeixen del fitxer de la mateixa forma que s'emmagatzemen, és a dir, en forma binària.

Sintaxi de fread()

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

Paràmetres:

  • ptr: punter al bloc de memòria a llegir.
  • mida: la mida de cada element a llegir (en bytes).
  • nmemb: nombre d'elements.
  • punter_fitxer : FILE punter al flux del fitxer d'entrada.

Valor de retorn:

  • Nombre d'objectes escrits.

Exemple: Programa per llegir des d'un fitxer binari mitjançant 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;> }>

>

com obrir un fitxer amb java

>

Sortida

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

Si tenim diversos registres dins d'un fitxer i hem d'accedir a un registre concret que es troba en una posició específica, hem de fer un bucle a través de tots els registres abans d'aquest per obtenir el registre. Fer-ho malgastarà molta memòria i temps operatiu. Per reduir el consum de memòria i el temps operatiu podem utilitzar fseek() que proporciona una manera més fàcil d'arribar a les dades requerides. La funció fseek() en C cerca el cursor al registre donat al fitxer.

Sintaxi per a fseek()

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

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

>

>

Sortida

81>

rebobina () en C

El rebobinar () La funció s'utilitza per portar el punter al fitxer al començament del fitxer. Es pot utilitzar en lloc de fseek() quan voleu el punter del fitxer al començament.

Sintaxi de rebobinar()

  rewind   (  file_pointer  );>

Exemple

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

>

>

Sortida

Geeks for Geeks>

Més funcions per a operacions amb fitxers C

A la taula següent s'enumeren algunes funcions més que es poden utilitzar per realitzar operacions de fitxers o ajudar a realitzar-les.

Funcions Descripció
fopen() S'utilitza per crear un fitxer o per obrir un fitxer.
fclose() S'utilitza per tancar un fitxer.
fgets() S'utilitza per llegir un fitxer.
fprintf() S'utilitza per escriure blocs de dades en un fitxer.
fscanf() S'utilitza per llegir blocs de dades d'un fitxer.
getc() S'utilitza per llegir un sol caràcter en un fitxer.
putc() S'utilitza per escriure un sol caràcter en un fitxer.
fseek() S'utilitza per establir la posició d'un punter de fitxer a una ubicació esmentada.
ftell() S'utilitza per retornar la posició actual d'un punter de fitxer.
rebobinar () S'utilitza per posar el punter del fitxer al començament d'un fitxer.
putw() S'utilitza per escriure un nombre enter en un fitxer.
getw() S'utilitza per llegir un nombre enter d'un fitxer.