Técnicas de Programação I Conceitos básicos C/C++ Material baseado em sites da internet em especial no livro: STARTING OUT WITH C++ C++: Manipulação de Arquivos (1) ifstream : leitura (2) ofstream : escrita (3) fstream : leitura e escrita 1
C++: Objeto fstream Declaração: fstream arquivo; Somente Leitura: file.open( myfile.dat,ios:in); Somente Escrita: file.open( myfile.dat,ios:out); Leitura e Escrita: file.open( myfile.dat, ios:in ios:out); Modos de abertura de arquivos Especifica como o arquivo deve ser aberto e o que pode ser feito com ele ios:in e ios:out são exemplos de modos de abertura de arquivos, file mode flags (flags de abertura de arquivos) Flags de abertura podem ser combinados e passados como o segundo parâmetro na abertura do arquivo 2
Flags de Abertura ios::app ios::ate ios::binary ios::in ios::out Cria novo arquivo, ou adiciona ao final de um arquivo existente Vai para o final do arquivo; escreve em qquer lugar Lê/escreve em modo binário Abre para leitura Abre para escrita Flags de Abertura Nem todas as cobinações fazem sentido ifstream e ofstream possuem modos default, logo o segundo parâmetro da função open é opcional 3
Modos Default ofstream: Abertura somente para escrita Não são permitidas leituras Se não existe o arquivo ele é criado O conteúdo é apagado caso o arquivo exista Para associar outro comportamento: ofstream gradelist("grades.dat", ios::app); ifstream: Abertura somente para escrita Não é permitido escrever no arquivo A abertura falha caso o arquivo não exista Abertura de Arquivos para Escrita e Leitura Leitura e Escrita simultânea em arquivos Leitura de dados do arquivo memória Atualização dos dados Escrita dos dados atualizados no arquivo Utilização do objeto fstream : fstream gradelist("grades.dat", ios::in ios::out); 4
Detentando erros na abertura (1) Função fail() da stream infile.open( myfile ); if (infile.fail()) { cout << Erro abertura do arquivo ; exit(1); } Detecting File Open Errors (2) Testar o status da stream utilizando o operador! infile.open( myfile ); if (!infile) { cout << Erro abertura do arquivo ; exit(1); } 5
Formatação da saída Utilização de manipuladores Idênticos aos manipuladores em cout left, right oct, dec, hex endl, flush showpos, noshowpos showpoint, noshowpoint left or right justify output display output in octal, decimal, or hexadecimal write newline (endl only) and flush output do, do not show leading + with non-negative numbers do, do not show decimal point and trailing zeroes Formatação da saída fixed, scientific setw(n) setprecision(n) setfill(ch) use fixed or scientific notation for floatingpoint numbers sets minimum field output width to n sets floating-point precision to n uses ch as fill character 6
Detecção de Erros eof() true if eofbit set, false otherwise fail() true if failbit or hardfail set, false otherwise bad() true if badbit set, false otherwise good() true if goodbit set, false otherwise clear() clear all flags (no arguments), or clear a specific flag Bits de Estado de Erro ios::eofbit ios::failbit ios::hardfail ios::badbit set when end of file detected set when operation failed set when an irrecoverable error occurred set when invalid operation attempted ios::goodbit set when no other bits are set 7
Funções de Leitura e Escrita Diferentemente do operador >>, estas funções não pulam espaços em branco: getline: lê uma linha get: lê um caracter Função getline getline(char s[ ], int max, char stop = \n ) char s[ ]: variável para armazenar o valor lido int max : número máximo de caracteres a serem lidos char stop: caracter de término de leitura caso o numero máximo max não tenha sido atingido 8
13.7 Arquivos Binários Arquivos Binários armazenam os dados no mesmo formato que em memória principal (RAM) Arquivos texto armazenam os dados no formato ascii (strings) Arquivos são abertos por default no modo TEXTO Manipulação de arquivos Binários Flag ios::binary na abertura do arquivo infile.open( myfile.dat,ios::binary); Funções read e write para leiitura e escrita read(char *buffer, int numberbytes) write(char *buffer, int numberbytes) 9
Função: read e write read(char *buffer, int numberbytes) write(char *buffer, int numberbytes) buffer: variável a ser utilizada para armazer o valor a ser lido do arquivo numberbytes: número de bytes a serem lidos Exemplo: write Para escrever um vetor de doubles ofstream outfile( myfile, ios:binary); double d[2] = {12.3, 34.5}; outfile.write( reinterpret_cast<char *>(d), sizeof(d) ); 10
Exemplo: read Para ler dois doubles para um vetor ifstream infile( myfile, ios:binary); double data[2]; infile.read( reinterpret_cast<char *>(data), 2*sizeof(double) ); Trabalhando com Registros Para escrever e ler registros (struct) em arquivos Utilizar binary flag na abertura Utilizar as funções read, write 11
Struct + arquivos: Exemplo struct T_aluno { int matricula; float nota; char nome[20]; }; T_aluno aluno;... // escreve o registro no arquivo gradefile.write( reinterpret_cast<char*>(aluno), sizeof(aluno)); Exercícios Implemente um programa que obtêm do usuário os seguintes dados de uma pessoa: nome, endereço, telefone e idade. Estes dados devem ser escritos num arquivo binário como registros. 12