![]() |
Índex |
Miguel A. Almarza
Departament d'Informàtica IES Mare de Deu de la Merce |
Nom del flux | Significat | Disposotiu per defecte |
cin | Entrada estàndard | Teclat |
cout | Sortida estàndard | Monitor |
cerr | Error estàndard | Monitor |
clog | Versió buffer de cerr | Monitor |
Nom de la classe | Tipus de fitxer |
ofstream | per a fitxers oberts per a escriptura |
ifstream | per a fitxers oberts per a lectura |
fstream | per a fitxers oberts per a lectura i escriptura |
Indicador | Com actua si activat | Valor |
skipws | Descarta espais en blanc, tabuladors i new line del fluxe d'entrada si està activat. | 0x0001 |
left | La sortida s'alinea a l'esquerra | 0x0002 |
right | La sortida s'alinea a la dreta | 0x0004 |
internal | Els valors numèrics s'omplen amb espais en blanc fins a omplir tot el camp. | 0x0008 |
dec | Conversió a decimal | 0x0010 |
oct | Conversió a octal | 0x0020 |
hex | Conversió a hexadecimal | 0x0040 |
showbase | Mostra la base de conversió del número (decimal, octal o hexadecimal) | 0x0080 |
showpoint | Mostra el punt decimal a tots els nombres. | 0x0100 |
uppercase | La e d'exponencial i la x d'hexadecimal surten en majúscules. | 0x0200 |
showpos | Mostra el signe + en els nombres positius. | 0x0400 |
scientific | Els valors numèrics en coma flotant surten en notació científica. | 0x0800 |
fixed | El contrari de scientific. | 0x1000 |
unitbuf | El sistema d'entrada sortida dona sortida a les dades desprès de cada operació. | 0x2000 |
Les funcions setf i unsetf | |
#include <iostream.h> main() { cout.setf(ios::uppercase); cout.setf(ios::scientific); cout << 16.; cout.unsetf(ios::uppercase); cout.unsetf(ios::scientific); cout << 16.; cout.setf(ios::showpos | ios::fixed); cout << 24; } | La sortida del primer cout << 16.; per pantalla és La sortida del segon cout << 16.; per pantalla és La sortida del tercer cout << 16.; per pantalla és Per activar més d'un indicador en una única instrucció veiem que es pot fer el or de bits. |
La funció flags | |
#include <iostream.h> main() { long IndicadorsAnteriors = cout.flags(); cout.setf(ios::uppercase); cout.setf(ios::scientific); cout << 16. << endl; cout.setf(ios::showpos ¦ ios::fixed); cout << 24 << endl; cout.flags(IndicadorsAnteriors); cout << 16. << endl; cout << 24 << endl; } | La sortida per pantalla és: 1.6E+01 +24 16 24 |
Indicador | Tres funcions de ios |
int width(); int width(int n); | Llegir i/o establir l'amplada de camp. |
int precision(); int precision(int n); | Llegir i/o establir nombre de dígits significatius. La precisió per defecte és 6. En el d'un nombre real (float,...) la precisió és el nombre de decimals. |
int fill(); int fill(int caracter); | Llegir i/o establir caràcter per omplir. Per defecte és l'espai en blanc. |
Les funció precision, fill i width | |
#include <iostream.h> main() { //Llegir valors inicials int Precisio = cout.precision(); int CaracterOmplir = cout.fill(); int Amplada = cout.width(); cout.width(15); cout.fill('$'); cout.precision(2); cout << 3.458 << endl; //Torna a posar els valors inicials cout.precision(Precisio); cout.fill(CaracterOmplir); cout.width(Amplada); } | La sortida per pantalla és: Fixeu-vos que tenim 11 caràcters $ i 4 caràcters en el número 3.46 i que com hem posat dos decimals de precisió ha arrodonit el número 3.458 que havia d'escriure. |
Manipulador | Propòsit | Entrada/sortida |
dec | Dades en format decimal. | Entrada i sortida |
endl | Donar sortida a un caràcter nueva línia i volcar el flux. | Sortida |
ends | Donar sortida a un NULL | Sortida |
flush | Volcar un flux | Sortida |
hex | Dades en format hexadecimal | Entrada i sortida |
oct | Dades en format octal | Entrada i sortida |
resetiosflags(long f) | Desactivar indicadors que es troben en f | Entrada i sortida |
setbase(int base) | Fixa la base dels nomres amb el valor base | Sortida |
setfill(int ch) | Posa el caràcter per omplir els camps | Sortida |
setiosflags(long f) | Activar indicadors que es troben en f | Entrada i sortida |
setprecision(int p) | Posa el número de dígits de precisió | Sortida |
setw(int amplada) | Amplada de camp | Sortida |
ws | Descartar espais en blanc incials | Entrada |
Ús dels manipuladors | |
#include <iostream.h> main() { cout << 100 << endl; cout << oct << 100 << endl; cout << hex << 100 << endl; } | 144 64 |
Funció main | Sortida per pantalla |
main() { Complex z; cin >> z; cout << "Has introduït " << z; } | ![]() |
Sobrecàrrega dels operadors >> i << per a la classe complex | |
class Complex { float a,b; public: ················································· //Sobrecàrrega dels operadors insercció i extracció friend ostream &operator<<(ostream &flux, Complex z); friend istream &operator>>(istream &flux, Complex &z); }; ostream &operator<<(ostream &flux, Complex z) { flux << z.a; flux.setf(ios::showpos); flux << z.b << 'i'; flux.unsetf(ios::showpos); return flux; } istream &operator>>(istream &flux, Complex &z) { cout << "Dades d'un complex" << endl; cout << "Introdueix la part real: "; flux >> z.a; cout << "Introdueix la part imagin…ria: "; flux >> z.b; return flux; } main() { Complex z; cin >> z; cout << "Has introduït " << z; } |
Manipulador de sortida | Manipulador d'entrada |
ostream &NomManipulador(ostream &flux) { ··················· return flux; } |
istream &NomManipulador(istream &flux) { ··················· return flux; } |
Exemple 1 | Exemple 2 |
#include <iostream.h> ostream &PosaFrm1(ostream &Flux) { Flux.width(20); Flux.precision(2); Flux.fill('@'); return Flux; } main() { cout << PosaFrm1 << 123.456789 << endl; } | #include <iostream.h> #include <string.h> istream &DemanaPassword(istream &Flux) { cout << '\a'; cout << "Escriu la paralula de pas: "; return Flux; } main() { char Password[100]; do { cin >> DemanaPassword >> Password; } while (strcmp(Password,"Pedro")); cout << "Molt b‚"; } |
ios::app | La informació que surt s'afegeix al final del fitxer. |
ios::ate | Pot escriure's al final del fitxer, encara que es poden realitzar les operacions d'entrada sortida a qualsevol part del fitxer. |
ios::binary | Mode binari. Per defecte els arxius s'obren en mode text. |
ios::in | Obrir per a entrada de dades. Si el flux és de tipus ifstream no és necessari fer-ne ús. |
ios::nocreate | La funció open() no pot obrir el fitxer si no està creat abans. |
ios::noreplace | La funció open() no pot obrir el fitxer si ja existeix. |
ios::out | Obrir per a sortida de dades. Si el flux és de tipus ofstream no és necessari fer-ne ús. |
ios::trunc | Esborra el contingut d'un fitxer existent. |
ofstream MiFitxer; MiFitxer.open("a:prova.txt");Podem crear directament el flux i la seva connexió amb el fitxer mitjançant una única instrucció:
ofstream MiFitxer("a:prova.txt");Si la funció open no té èxit en obrir el fitxer llavors fa que el flux sigui igual a 0. Així la comprovació es fa mitjançant la instrucció següent:
MiFitxer.open("a:prova.txt"); if (!MiFitxer) { cout << "No he pogut obrir a:prova.txt" << endl; exit(1); }Naturalment quan acabem d'utilitzar un flux hem de tancar el fitxer associat mitjançant la funció membre close:
MiFitxer.close();Un programa senzill amb un fitxer de sortida és el següent:
Codi de creació d'un fitxer | Contingut del fitxer |
#include <fstream.h> main() { ofstream MiFitxer; int PreuLlibre = 3456; MiFitxer.open("a:prova.txt"); MiFitxer << "Prova de text en fitxers" << endl; MiFitxer << "El preu de un llibre es " << PreuLlibre << " pts." << endl; MiFitxer.close(); } | Si obrim el fitxer a:prova.txt amb un processador de textos veuremProva de text en fitxers El preu de un llibre es 3456 pts. Nota: No cal incloure l'arxiu de capçalera iostream.h car ja està fet aquest include dins el fitxer fstream.h |
Classe | Significat | ![]() |
filebuf | Proveeix el buffer associat i els mètodes adients als fluxos de la classe iostream per a entrada/sortida cap a fitxers de disc | |
strtstreambuf | Proveeix la memòria adient per treballar les cadenes de caràcters. | |
stdiobuf | Proveeix els buffers i les funcions per treballar l'entrada sortida cap a disc quan es treballa amb el fitxer de capçalera de C stdio.h |
filebuf * open(const char * NomFitxer, int mode, int protecció=filebuf::openprot); | ||||||||||||||||||||||||||||
Aquesta funció obre un fitxer i l'associa amb l'objecte l'objecte que crida la funció. Si té èxit torna l'adreça de l'objecte i en
cas contrari torna un NULL. El paràmetre mode fa ús de la taula següent:
Es poden combinar dos o més d'aquests valors amb l'operador or de bits ¦. El valor del paràmetre protecció indica que por defecte és compartit i té els valors possibles de sh_compat (compartit), sh_none (no compartit), sh_read (compartit per a lectura), sh_write (compartit per a escriptura). | ||||||||||||||||||||||||||||
filebuf * close(); | ||||||||||||||||||||||||||||
Aquesta funció buida el buffer, es a dir, descarrega les dades de sortida en el fitxer de disc i tanca el fitxer. Si la funció té èxit torna la
direcció de l'objecte filebuf que la ha cridada. en cas contrari torna un NULL. | ||||||||||||||||||||||||||||
filebuf * atach(filedesc fd); | ||||||||||||||||||||||||||||
Aquesta funció associa l'objecte filebuf que la crida amb el fitxer especificat amb el descriptor fd. Si el fitxer ja està obert torna un NULL i
en cas contrari torna la direcció de l'objecte. El tipus filedesc és igual que el tipus int.
| ||||||||||||||||||||||||||||
filedesc fd() const; | ||||||||||||||||||||||||||||
Aquesta funció torna el descriptor d'un fitxer associat a l'objecte que la crida. Torna EOF si l'objecte no està associat a cap descriptor.
| ||||||||||||||||||||||||||||
int is_open() const; | ||||||||||||||||||||||||||||
Aquesta funció torna zero si el fitxer està tancat i diferent de zero si el fitxer està obert.
|
int setmode(int modo=filebuf::text); | |
Aquesta funció canvia permet posar el mode text o el mode binari per als fitxers fets en MS-DOS.
Recordem que en el mode text es fa una petita conversió, que consisteix en posar en el fitxer en lloc d'un '\n' un CR+LF. Quan llegim un fitxer en mode text es fa el canvi al contrari i també el Ctrl-Z s'interpreta com un EOF. Es preferible fer ús del mode binari. Aquesta és una funció global que es troba declarada a l'arxiu de capçalera IO.H. |
#include <fstream.h> #include <stdlib.h> main() { filebuf Buffer; if (Buffer.open("a:fitxer02.dat", ios::out) == NULL) { cerr << "Error en obrir el fitxer"<<endl; exit(1); } ostream fSortida(&Buffer); fSortida << "Proba de fitxers amb buffer" << endl; fSortida << "i amb objectes de la classe ostream" << endl; Buffer.close(); } |
ostream &put(char ch) | Insereix un caràcter a l'stream que la crida. |
ostream &write(const char * pch,int n) | Insereix n caràcters a l'stream que la crida. |
ostream &flush() | Buida dins el fitxer el contingut del buffer associat a l'stream que la crida. |
lomg tellp() | Ens dona la posició del punter del fitxer. |
ostream &seekp(long) | Mou el punter a una posició absoluta. |
ostream &seekp(long, seek_dir) | Mou el punter a una posició relativa a una de les tres possibles de la enumeració següent:
enum seek_dir {beg, cur, end} |
#include <fstream.h> #include <stdlib.h> #include <iostream.h> main() { filebuf Buffer; char Frase[200]; if (Buffer.open("a:fitxer02.dat", ios::in) == NULL) { cerr << "Error en obrir el fitxer"<<endl; exit(1); } istream fEntrada(&Buffer); fEntrada.getline(Frase,199,'\n'); cout << Frase << endl; fEntrada.getline(Frase,199,'\n'); cout << Frase << endl; Buffer.close(); } |
int get(); istream& get(signed char*, int len, char = '\n'); istream& get(unsigned char*, int len, char = '\n'); istream& get(unsigned char&); istream& get(signed char&); istream& get(streambuf&, char = '\n'); | istream& get(signed char&); Llegeix un caràcter de l'stream que la crida i ho posa en la variable ch. Per a més informació sobre les altres formes de la funció llegir un manual. |
istream &getline(char * cadena, int n, char delim = '\n') | Llegeix caràcters de l'stream que la crida i els posa a cadena. La funció continua llegint fins a trobar un delimitador ('\n' per defecte) o fins a llegir n-1 caràcters. Després afegeix un '\0' com a darrer caràcter rebutjant el delimitador. |
istream &read(char * cadena, int n) | Aquesta funció llegeix caràcters de l'stream que la crida i els posa a cadena. S'atura de llegir quan ha llegit n caràcters o arriba al fina del fitxer. No afegeix '\0' al final. |
istream &ignore(int n=1, int delim = EOF) | Salta n caràcters de l'stream. Para de saltar si troba el delimitador que també es saltat. |
int peek() | Torna el següent caràcter sense quitar-lo del flux. |
int gcount() | Aquesta funció torna el número de caràcters llegits en la darrera operació de lectura sense format de dades. |
istream &putback(char) | Torna a posar un caràcter en el stream. |
istream &seekg(long) istream &seekg(long, seek_dir) | Mou el punter a una posició absoluta. Mou el punter a una posició relativa a una de les tres possibles de la enumeració següent: enum seek_dir {beg, cur, end} |
long tellg() | Ens dona la posició del punter del fitxer. |
void open(const char * NomFitxer, int modo=ios::out, int p=openprot) | Una de les formes del constructor permet crear un ofstream sense associar li un fitxer de disc. Per aquesta raó la funció open ens permet associar un fitxer de disc amb un ofstream. |
file * rdbuf() | Torna un punter al l'objecte filebuf associat a l'stream |
#include <fstream.h> #include <stdlib.h> main() { ofstream fSortida("a:/fitxer04.dat"); if (!fSortida) { cerr << "Error en obrir el fitxer"<<endl; exit(1); } fSortida << "Proba de fitxers amb ofstream" << endl; fSortida << "i sense haver de declarar esplícitament un buffer." << endl; fSortida.close(); } |
void open(const char * NomFitxer, int modo=ios::in, int p=openprot) | Una de les formes del constructor permet crear un ifstream sense associar-li un fitxer de disc. Per aquesta raó la funció open ens permet associar un fitxer de disc amb un ifstream. |
file * rdbuf() | Torna un punter al l'objecte filebuf associat a l'stream |
#include <fstream.h> #include <stdlib.h> main() { char Frase[200]; ifstream fEntrada("a:/fitxer04.dat"); if (!fEntrada) { cerr << "Error en obrir el fitxer"<<endl; exit(1); } fEntrada.getline(Frase,199,'\n'); cout << Frase << endl; fEntrada.getline(Frase,199,'\n'); cout << Frase << endl; fEntrada.close(); } |
void open(const char * NomFitxer, int modo, int p=openprot) | Una de les formes del constructor permet crear un ifstream sense associar-li un fitxer de disc. Per aquesta raó la funció open ens permet associar un fitxer de disc amb un fstream. |
file * rdbuf() | Torna un punter al l'objecte filebuf associat a l'stream |
#include <fstream.h> #include <stdlib.h> main() { char Frase[200]; fstream fES("a:/fitxer05.dat", ios::out); if (!fES) { cerr << "Error en obrir el fitxer"<<endl; exit(1); } fES << "Proba de fitxers d'entrada sortida amb la classe fstream" << endl; fES << "i sense haver de declarar exp¡citament un buffer." << endl; fES.close(); fES.open("a:/fitxer05.dat", ios::in); if (!fES) { cerr << "Error en obrir el fitxer"<<endl; exit(1); } fES.getline(Frase,199,'\n'); cout << Frase << endl; fES.getline(Frase,199,'\n'); cout << Frase << endl; fES.close(); } |
Exemple de fitxer amb accés seqüencial | |
#include <iostream.h> #include <fstream.h> #include <stdlib.h> class Llibre { char Titol[450]; int Preu; public: Llibre() {Titol[0]='\0'; Preu=0;} friend ostream &operator<<(ostream &flux, Llibre l); friend istream &operator>>(istream &flux, Llibre &l); }; ostream &operator<<(ostream &flux, Llibre l) { flux << "Titol: "; flux << l.Titol << endl; flux << "Preu: "; flux << l.Preu << endl; return flux; } istream &operator>>(istream &flux, Llibre &l) { cout << "Titol: "; cin.ignore(); flux.getline(l.Titol,450,'\n'); cout << "Preu: "; flux >> l.Preu; return flux; } int Menu(); void Introduir(char * NomF, int Opcio); void LlegirTots(char * NomF); main() { int Opcio = 1; char NomFitxer[45]; while (Opcio) { Opcio = Menu(); switch (Opcio) { case 1: cout << "Nom del fitxer: "; cin >> NomFitxer; break; case 2: case 3: Introduir(NomFitxer, Opcio); break; case 4 : LlegirTots(NomFitxer); break; } } } int Menu() { int Opcio =-1; cout << "0 Acabar" << endl; cout << "1 Nom del fitxer" << endl; cout << "2 Crear fichero" << endl; cout << "3 Afegir" << endl; cout << "4 Llegir tots" << endl; while ((Opcio < 0) || (Opcio > 4)) cin >> Opcio; return Opcio; } void Introduir(char * NomF, int Opcio) { fstream fSortida; Llibre RegProvisional; char Seguir = 'S'; if (Opcio == 2) fSortida.open(NomF, ios::out | ios::binary); if (Opcio == 3) fSortida.open(NomF, ios::nocreate | ios::app | ios::binary); if (!fSortida) { cout << "Error en obrir el fitxer \n"; exit(1); } while (Seguir == 'S' | Seguir == 's') { cin >> RegProvisional; fSortida.write((char *) &RegProvisional, sizeof(RegProvisional)); cout << "Seguir? (s/n)"; cin >> Seguir; } fSortida.close(); } void LlegirTots(char * NomF) { fstream fEntrada; Llibre RegProvisional; int Mida = sizeof(RegProvisional); fEntrada.open(NomF, ios::nocreate | ios::in | ios::binary); while ( fEntrada.read((char *) &RegProvisional, Mida) ) cout << RegProvisional << endl; fEntrada.close(); } |
ios::beg | principi de l'stream |
ios::cur | posició actual del punter |
ios::end | final de l'stream |
Exemple de fitxer amb accés aleatori. | |
void LlegirUn(char * NomF) { fstream fEntrada; Llibre RegProvisional; int Mida = sizeof(RegProvisional); int NumRegistre; fEntrada.open(NomF, ios::nocreate | ios::in | ios::binary); cout << "Introdueix el número del registre: "; cin >> NumRegistre; fEntrada.seekp(NumRegistre*Mida, ios::beg); fEntrada.read((char *) &RegProvisional, Mida); cout << RegProvisional << endl; fEntrada.close(); } |
La classe ios té les funcions següents que ens permeten consultar l'estat d'aquests bits:
eofbit Es posa a 1 si hem arribat al final del fitxer i a 0 en cas contrari. failbit Es posa a 1 si ha succeït un error de E/S que no és fatal i a 0 en cas contrari. badbit Es posa a 1 si ha succeït un error fatal de E/S i a 0 en cas contrari.
bool bad() Torna cert si eofbit està a 1, fals en cas contrari. bool eof() Torna cert si badbit està a 1, fals en cas contrari. bool fail() Torna cert si failbit està a 1, fals en cas contrari. bool good() Torna cert si no hi ha errors i fals en cas contrari.