Instrucțiuni de intrare/ieșire în limbajul C

From Algopedia
Jump to: navigation, search

Tipul fișier

Limbajul C folosește tipul FILE pentru a lucra cu fișiere pe disc. O variabilă de tip fișier se declară astfel:

FILE *fin;

Această variabilă va fi folosită în operațiuni pe fișiere.

Deschiderea și închiderea fișierelor

Înainte de a putea citi sau scrie într-un fișier el trebuie mai întîi deschis. Pentru aceasta vom folosi funcția fopen. Pentru a deschide un fișier pentru citire vom folosi:

fin = fopen( "problema.in", "r" );

Pentru a deschide un fișier pentru scriere vom folosi:

fout = fopen( "problema.out", "w" );

Litera "r" vine de la "read" - a citi în engleză, iar litera "w" vine de la "write" - a scrie în engleză.

Cînd am terminat operațiunile de citire, respectiv scriere, fișierele trebuie închise. Pentru aceasta vom folosi funcția fclose:

fclose( fin );
fclose( fout );

Atenție: închiderea fișierelor nu este opțională ci este obligatorie! Altfel riscați să pierdeți datele din fișiere.

Citirea din fișiere

Pentru a citi numere dintr-un fișier vom folosi funcția fscanf, astfel:

fscanf( fin, "%d", &n );

unde fin este o variabilă de tip fișier deschis anterior pentru citire, iar n este o variabilă de tip int. Remarcați caracterul & din fața variabilei n. Al doilea parametru al funcției, șirul de caractere "%d" conține descrierea tipului de variabile citite cu funcția fscanf, respectiv d de la decimal. În cazul în care citim mai multe variabile acest șir va conține mai multe %d fără spații între ele:

fscanf( fin, "%d%d%d", &n, &x, &y );

Pentru a citi diverse tipuri de variabile vom folosi diverse codificări:

Tip variabilă Format folosit (litere)
char %d sau %c
short %hd
int %d
long long %lld
double %lf

Scrierea în fișiere

Pentru a scrie numere într-un fișier vom folosi funcția fprintf, astfel:

fprintf( fout, "Valoarea lui n este %d\n", n );

unde fout este o variabilă de tip fișier deschis anterior pentru scriere, iar n este o variabilă de tip int. Remarcați că de data aceasta n nu mai este precedat de caracterul &. Al doilea parametru al funcției este similar cu cel de la instrucțiunea fscanf, dar el poate conține nu numai simboluri de formatare ci și caractere de afișat, așa cum se vede și din exemplu. O altă diferență față de fscanf este că valorile de afișat pot fi nu numai variabile ci și expresii. De exemplu:

fprintf( fout, "Suma dintre %d și %d este %d\n", a, b, a + b );

Exemplu de folosire a fișierelor în limbajul C

Iată un exemplu complet de program care citește două numere a și b, cu a ≤ b și afișează toate numerele întregi cuprinse între a și b, cu un spațiu între ele și fără spațiu după ultimul număr:

#include <stdio.h>

int main() {
  FILE *fin, *fout;
  int a, b, i;

  fin = fopen( "numere.in", "r" );
  fscanf( fin, "%d%d", &a, &b );
  fclose( fin );

  fout = fopen( "numere.out", "w" );
  fprintf( fout, "%d", a );
  for ( i = a + 1; i <= b; i++ )
    fprintf( fout, " %d", i );
  fprintf( fout, "\n" );
  fclose( fout );

  return 0;
}

Citirea și scrierea caracterelor

Deși fscanf și fprintf pot citi/scrie caractere folosind descriptorul %c această metodă nu este recomandată. În locul fscanf/fprintf vom folosi perechea de funcții fgetc/fputc, astfel:

c = fgetc( fin ); // citeste din fisierul fin un caracter si depune-l in variabila c
fputc( c, fout ); // scrie caracterul c in fisierul fout

Pentru a citi/scrie un șir de caractere vom chema în mod repetat fgetc/fputc.

Detectarea sfîrșitului de fișier

Uneori este necesar să citim caractere dintr-un fișier fără a ști în prealabil cîte caractere avem de citit. În aceste cazuri vom citi pînă la terminarea fișierului. Cum putem afla că fișierul s-a terminat? Atunci cînd fișierul s-a terminat funcția fgetc returnează o valoare specială, codificată prin EOF - end of file în engleză. În aceste situații va trebui ca în condiția din buclă să testăm dacă caracterul citit este egal cu EOF.

Exemplu de citire/scriere a caracterelor în limbajul C

Iată un exemplu complet de program care citește un șir de caractere pîna la finalul fișierului și scrie același șir în fișierul de ieșire, convertind literele mici la litere mari:

#include <stdio.h>

int main() {
  FILE *fin, *fout;
  char c;

  fin = fopen( "upper.in", "r" );
  fout = fopen( "upper.out", "w" );
  c = fgetc( fin );
  while ( c != EOF ) {
    if ( c >= 'a' && c <= 'z' )
      c = c - 'a' + 'A';
    fputc( c, fout );
    c = fgetc( fin );
  }
  fclose( fin );
  fclose( fout );

  return 0;
}