Sunteți pe pagina 1din 7

Operații I/O în limbajul C

n Biblioteca standard stdio.h și conio.h


Operații de n Fișiere text
intrare/ieșire în C++ ¨ printf/fprintf
¨ scantf/fscanf

Mihai Gabroveanu n Fișiere binare


¨ fread
¨ fwrite

Operații de I/O în limbajul C++ 2

Operații I/O în limbajul C++ Ce este un stream?


n Limbajul C++ moștenește de la C funcțiile de n Stream-ul este un concept abstract care înglobează
I/O orice flux de date de la o sursă (canal de intrare) la
o destinație (canal de ieșire)
¨ Dezavantaj: permit manipularea doar a tipurilor de
bază n Biblioteca standard ce înglobează ierarhia de clase
pentru opertații de I/O
n Limbajul C++ introduce o ierarhie de clase #include <iostream.h> // compilatoare vechi
pentru a realiza operațiile de intrare/ieșire (I/O) sau
n Această ierarhie are la bază conceptul de #include <iostream> // compilatoare noi
stream (flux) using namespace std;

Operații de I/O în limbajul C++ 3 Operații de I/O în limbajul C++ 4


Ierarhia de clase I/O Stream-uri standard
n Stream-uri standard create automat la rularea unui program:
¨ cin – obiect de tip istream (stream-ul standard de intrare, de regula
tastatura )
¨ cout – obiect de tip ostream (stream-ul standard de ieşire, de regulă
ecranul)
¨ cerr – obiect de tip ostream (stream-ul standard de eroare, , de regulă
ecranul)
n Operatori
¨ Inserare <<
¨ Extragere >>

Operații de I/O în limbajul C++ 5 Operații de I/O în limbajul C++ 6

Formatarea ieșirii Exemplu


#include <iostream>
n Funcții pentru formatarea ieșirii using namespace std;

long setf(long indicator);//activarea indicatorilor de format void main(){


cout << 128 << endl ;// afişarea se face pe dimensiune implicita
long unsetf(long indicator);//dezactivarea indicatorilor de format cout.unsetf(ios::dec);//dezactivez afisarea in zecimal
int width(int w);//specifica latimea campului de formatat cout.setf(ios::hex);// activez afisare in hexazecimal
cout.setf (ios::showbase);//se afiseaza baza
int precision(int p);//specifica numarul de cifre de dupa virgula cout << 255 << endl ;
cout.setf(ios::scientific);
char fill(char ch);//specifica caracterul de umplere, implicit spatiu cout << 123.456;
}

128
0xff
1.234560e+002

Operații de I/O în limbajul C++ 7 Operații de I/O în limbajul C++ 8


Exemplu Manipulatori
#include <iostream>

using namespace std;

int main(){ n Manipulatori sunt funcții speciale ce pot fi incluse (inserate) în


cout << 123 << endl ;// afişarea se face pe dimensiune implicita operațiile de I/O cu scopul stabilirii caracteristicilor de
cout.width(10);// se modifica câmpul la dimensiunea 10 formatare
cout << 123 << endl ;
cout.width(10);// se modifica câmpul la dimensiunea 10 n Pentru utilizarea acestora trebuie inclusă biblioteca
cout.fill('*');// se stabileşte caracterul de umplere '*' #include <iomanip.h> // compilatoare vechi
cout << 123 << endl ; sau
cout.width(10);// se modifica câmpul la dimensiunea 10
cout.precision(2);// se specifica afişarea cu precizie 2
#include <iomanip>
cout.setf(ios::fixed);// fixed este activat using namespace std;
cout << 123.456 << endl; 123
return 0;
}
123 n
*******123
****123.46

Operații de I/O în limbajul C++ 9 Operații de I/O în limbajul C++ 10

Manipulatori Manipulatori (cont)


n Manipulatorii definiţi sunt: n Manipulatorii definiţi sunt:
¨ dec - activează bitul dec (la intrare/ieşire) ¨ showpos - adaugă simbolul + in faţa valorilor poziţive
¨ hex - activează bitul hex (la intrare/ieşire) ¨ noshowpos - elimina simbolul + in faţa valorilor poziţive
¨ oct - activează bitul oct (la intrare/ieşire) ¨ left - aliniaza la stanga valoarea afisata
¨ showbase - afiseaza baza de numeratie ¨ right - aliniaza la dreapta valoarea afisata
¨ noshowbase – dezactiveaza afisarea bazei de numeratie ¨ internal - aliniere implicita
¨ endl - inserează caracterul ‘\n’ şi goleşte tamponul (la ¨ setprecision(int) - stabileşte precizia pentru numere în
ieşire) virgulă mobilă;
¨ flush - goleşte tamponul (la ieşire) ¨ fixed – afisare numere reale cu numar fix de zecimale
¨ setfill(char) - stabileşte caracterul de umplere; ¨ scientific – afisare numere reale in format stiintific
¨ setw(int) - stabileşte dimensiune câmpului pentru operaţia
următoare
Operații de I/O în limbajul C++ 11 Operații de I/O în limbajul C++ 12
Exemplu Definirea de manipulatori
#include <iostream>
#include <iostream> #include <iomanip>
#include <iomanip> using namespace std;
using namespace std;
ostream& formatReal(ostream& out){
out.width(10);
int main(){ out.precision(2);
cout << 123 << endl ; out.setf(ios::fixed);
cout << hex << showbase << 123 << endl ; out.fill('*');
cout << oct << showbase << 123 << endl ; return out;
cout << 1234.56 <<endl; }
cout << setprecision(2) << setw(10) <<setfill('*') << int main(){
setiosflags(ios::fixed); cout << formatReal<< 1234.56 <<endl;
cout << 1234.56 <<endl; return 0;
return 0; }
} 123
0x7b
***1234.56
0173
1234.56
***1234.56

Operații de I/O în limbajul C++ 13 Operații de I/O în limbajul C++ 14

Supraîncărcarea operatorilor << si >> Supraîncărcarea operatorilor << si >>

n Se face numai cu funcţii friend n Implementare


istream& operator>>(istream& in, IdClasa& ob){
n Sintaxa //citire date membre ale obiectului ob din input stream-ul in
...
class IdClasa{ return in;
}
...
friend istream& operator>>(istream& in, IdClasa& ob);
ostream& operator<<(ostream& out, const IdClasa& ob){
friend ostream& operator<<(ostream& out, const IdClasa& ob);
//afisare date membru ale obiectului ob in output stream-ul out
}; ...
return out;
}

Operații de I/O în limbajul C++ 15 Operații de I/O în limbajul C++ 16


Exemplu Exemplu (cont.)
#include <iostream> istream& operator>>(istream& in, Complex& z){
in>>z.re;
using namespace std; in>>z.im;
class Complex{ return in;
private: }
float re;
float im; ostream& operator<<(ostream& out, const Complex& z){
public: out<<z.re << std::showpos << z.im<<"*i";
Complex(){ out<<std::noshowpos;
re = 0; return out;
im = 0; }
}
int main(){
friend istream& operator>>(istream& in, Complex& z); Complex z;
friend ostream& operator<<(ostream& out, const Complex& z); cin>>z;
}; cout<<z;
}

Operații de I/O în limbajul C++ 17 Operații de I/O în limbajul C++ 18

Operații de intrare/ieșire cu fișiere Operații de intrare/ieșire cu fișiere

n Operațiile de intrare/ieșire cu fișiere se fac prin n Constructori


intermediul claselor ofstream::ofstream(const char* name,ios::openmode = ios::out | ios::trunc);
ifstream::ifstream(const char* name, ios::openmode = ios::in);
¨ ifstream
fstream::fstream(const char* name, ios::openmode = ios::in | ios::out);
¨ ofstream
¨ fstream

Operații de I/O în limbajul C++ 19 Operații de I/O în limbajul C++ 20


Operații de intrare/ieșire cu fișiere Operații de intrare/ieșire cu fișiere
n Moduri de deschidere a fişierelor n Rezultatul operaţiilor de intrare/ieşire poate fi testat prin
¨ ios::append - adauga la sfarsitul fişierului; intermediul a patru functii membre:
¨ ios::atend - poziţioneaza pointer-ul la sfârşitul fişierului, ¨ eof() verifică dacă s-a ajuns la sfarsitul fişierului;
însă informaţiile pot fi scrise oriunde în cadrul fişierului;
¨ ios::truncate - este modul de deschide implicit: vechiul ¨ bad() verifică dacă s-a executat o operaţie invalidă;
continut al fişierului este pierdut;
¨ fail() verifică dacă ultima operaţie a eşuat;
¨ ios::nocreate - dacă fişierul nu exista, atunci operaţia
eşuează; ¨ good() verifică dacă toate cele trei rezultate precedente sunt false.
¨ ios::noreplace - dacă fişierul deja există, atunci operaţia
eşuează; n Închiderea unui fișier se face apelând funcția
¨ close()
¨ ios::binary – deschide fișierul in mod binar.

Operații de I/O în limbajul C++ 21 Operații de I/O în limbajul C++ 22

Exemplu Operații de citire/scriere în mod binar


#include <conio.h> ifstream in("output.txt");
#include <iostream> if (!in){
#include <fstream> cerr<<"Eroare deschidere"; n Scrierea într-un fișier binar se face cu funcția
exit(0);
using namespace std; }
while(!in.eof()){
ostream& write ( const char* s , streamsize n );
int main(){ in>>t;
int n=10, t; if (in.good()){ n Citirea dintr-un fișier binar se face cu funcția
ofstream out("output.txt"); cout<<t<<endl;
for(int i=0;i<n;i++) } istream& read ( const char* s , streamsize n );
out<<i*i<<endl; }
out.close(); in.close();
getch();
}

Operații de I/O în limbajul C++ 23 Operații de I/O în limbajul C++ 24


Exemplu Poziționarea într-un fișier
#include <conio.h> ifstream in("output.bin",ios::binary);
#include <iostream>
#include <fstream>
if (!in){
cerr<<"Eroare deschidere fisier";
n Obținerea poziției într-un stream asociat unui fișier se face cu:
exit(0); ¨ pos_type ostream::tellp(); // pentru stream-urile de iesire
using namespace std; }
while(!in.eof()){ ¨ pos_type istream::tellg(); //pentru stream-urile de intrare
int main(){ in.read(reinterpret_cast<char*>(&t),
int n=10, t; sizeof(t)); n Poziționarea într-un stream se face cu:
ofstream out("output.bin", if (in.good()){
ios::binary); cout<<t<<endl; ¨ ostream& ostream::seekp(off_type offset,ios::seekdir pos); //pentru stream-urile de iesire
for(int i=0;i<n;i++) } ¨ istream& istream::seekg(off_type offset,ios::seekdir pos); //pentru stream-urile de intrare
out.write(reinterpret_cast<char*>(&i), }
sizeof(i)); in.close();
getch();
unde pos poate avea una din următoarele valori
out.close(); } ¨ ios::beg – specifică poziţia de la începutul stream-ului;
¨ ios::end – specifică poziţia de la sfârşitul stream-ului;
¨ ios::cur – specifică poziţia relativ la locatia curentă în stream;
reinterpret_cast convertește orice tip de pointer către orice alt tip de pointer, chiar și pentru
pointer către clase care nu au legătură. Rezultatul conversiei este o copie binară simplă a
valorii de la un pointer la altul. Sunt permise toate conversiile de pointer: nu este verificat nici
conținutul indicat, nici tipul de pointer în sine.
Operații de I/O în limbajul C++ 25 Operații de I/O în limbajul C++ 26

S-ar putea să vă placă și