[C++ operatii cu fisiere ]


OPERATII CU FISIERE 
Fișierele fizice sunt accesate în C++ prin variabile fisier. De regulă se folosesc tipul de date FILE , instrucțiunea de asociere între variabilă din program si fișierul fizic  fopen .
Pentru scriere există fprintf , pt citire instrucțiunea fscanf , închiderea fișierului se face cu cel se face cu fclose, se utilizează  antetul stdio,la citire(cu fscanf) variabilele sunt prefixate cu simbolul & , datele necesita descriptori de format gen "℅c"," ℅f" ,”d” (caractere,numere reale sau întregi) etc.
Se poate opera cu fisiere și prin intermediul fluxurilor de date cu instructiunile fstream și ifstream .
Fișierele standard predefinite sunt stdin identificat adesea cu tastatura , stdout identificat cu display-ul , dar există și lpt si prn pt imprimantă , error pt mesaje de eroare prestabilite.
Aceste fișiere predefinite funcționează în program ca variabile logice .
Exemplu cu stdin și stdout  http://ideone.com/bAaTjz

Problemă (proba practică atestat/bac)
 Fisierul text bac.txt conţine, pe o singură linie, cel mult 1000 de numere naturale nenule

cu cel mult 4 cifre fiecare, numerele fiind separate prin câte un spaţiu. Scrieţi un program
C/C++ care citeşte de la tastatură un număr natural nenul n (n?999) şi numerele din fişierul
bac.txt şi care afişează pe ecran, separate prin câte un spaţiu, toate numerele din fişier
care sunt divizibile cu n. Dacă fişierul nu conţine niciun astfel de număr, atunci se va afişa
pe ecran mesajul NU EXISTA.
Exemplu: dacă fişierul bac.txt conţine numerele: 3 100 40 70 25 5 80 6 3798,
pentru n=10 atunci pe ecran se va afişa: 100 40 70 80 (10p.)
*/
#include<iostream.h>
#include<stdio.h>
#include<io.h>
int s,nr,i,n,a[1000];
FILE *f;
void main()
{
f=fopen("bac.txt","r+");
do{
cout<<"n=";cin>>n;  }
while((n<0)||(n>999));
s=0;//s e variabila semafor , initial e 0 
while(!feof(f))
{ fscanf(f,"%d",&nr); if(nr%n==0)  { s=1;
//semaforul devine 1 cand gaseste un divizor
      cout<<"  "<<nr;}
 }
if(s==0) cout<<"NU EXISTA";fclose(f);
}
Instructiunea fclose ne inchide fisierul fizic !
Dacă e ignorată sistemul de operare va închide fișierul deschis, dar sunt posibile erori !

Problemă Se cere să eliminați blancurile dintr-un fișier a.in . Rezultatul apare în b.out.
Codul sursă în CodeBlocks
#include<fstream>
#include<cstring>
using namespace std;
int j,n ,i;
char s[200];
int main()
{
ofstream g("b.out");
ifstream f("a.in");
f>>s;n=strlen(s);
for(i=0;i<n;i++) {
 if(s[i]==char(32) )
       {for(j=i+1;j<n;j++) s[j-1]=s[j] ;n--; } }
g<<s; fclose(g);fclose(f);
return 0;
}
Obs.
  • char(32) e codul ASCII  pt tasta Space (mai numim caracterele inserate cu ea blancuri)
  • dacă declarăm s ca variabilă cu sintaxa char *s ; avem eroare cu MINGW ❄
  • s e declarat ca vector de tip char ❀