Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 C++ Entrada e Saída Arquivo Osmar de Oliveira Braz Junior 2 Objetivos ◼ Assuntos a serem abordados nesta apresentação Arquivo Organização Tipos de Arquivos Fluxos de bytes Manipulação de Arquivos Textos Manipulação de Arquivos Binários 3 Arquivos ◼ Um arquivo é de suma importância nos programas computacionais, desde o tempo em que o primeiro computador surgiu, pois, para que um programa faça algum tipo de operação, o mesmo precisa ser alimentado com informações: estas, ou são fornecidas pelo teclado, o que atualmente torna-se inviável, ou são fornecidos através de um arquivo. ◼ As estruturas de dados fora do ambiente do programa são conhecidas como arquivos. Considera-se como ambiente do programa a memória principal, onde nem sempre é possível ou conveniente manter certas estruturas de dados. ◼ Um arquivo é armazenado em um dispositivo de memória secundária, como discos, por exemplo, pode ser lido ou escrito por um programa. ◼ Um arquivo é formado por uma coleção de registros, cada registro é composto por campos e cada campo possui suas características específicas. Um ou mais campos desse registro é considerado campo-chave, que é o campo que diferencia um registro dos demais, evitando duplicidade de informações. ◼ Um sistema de banco de dados é composto por um ou vários arquivos, onde cada arquivo possui programas de manutenção que são: inclusão, exclusão lógica ou exclusão física, alteração, consulta geral, consulta específica e relatórios. 4 Persistência ◼ O armazenamento dos dados em variáveis ou vetores é temporário pois utiliza memória volátil. ◼ Para o armazenamento de longo prazo, ou seja para além do termino do programa que criou os dados é necessário utilizar memória não volátil. ◼ Dados persistentes - existem além da duração da execução do programa. ◼ Arquivos são armazenados em dispositivos de armazenamento secundários, como disco rígidos, flash drive, etc.. ◼ Fluxo – São dados ordenados lidos de ou gravados em um arquivo. 5 Hierarquia dos Dados ◼ Os itens de dados processados pelos computadores formam uma hierarquia de dados que se torna maior e mais complexa partindo dos bits(-) até os arquivos(+). Bit - a menor unidade de informação de um computador, pode ter valores 0 ou 1. Byte - um conjunto de 8 bits. Campo - um grupo de caracteres ou bytes que carregam um significado. Registro - um grupo de campos relacionados. Arquivo - um grupo de registros relacionados. 6 Arquivo Registro2 Maria Rua Y ... Maria Campo 00000000 01001101 Byte cliente.dat 1 Joao Rua X ... 2 Maria Rua Y ... 3 Pedro Rua Z ... 4 Luiz Rua W ... ... ... ... ... 0 Bit 7 Hierarquia dos Dados ◼ Junto com arquivos além da complexidade existe semântica na sua organização e acesso: Chave de registro – identifica um registro como pertencente a uma pessoa ou entidade particular – utilizada para fácil recuperação de registros específicos. Arquivo de acesso Sequencial –arquivo em que os registros são armazenados pela ordem do campo chave de registro. Arquivo de acesso Randômico ou Aleatório –arquivo em que os registros são armazenados pela ordem do campo chave de registro. 8 Arquivo e Fluxo ◼ C++ vê cada arquivo como um fluxo ou sequência de bytes. ◼ O sistema operacional fornece um mecanismo para determinar o final do arquivo. Como um marcador de fim do arquivo ou uma contagem do total de bytes no arquivo que é registrado nos dados mantidos na estrutura do sistema. Um programa C++ que processa um fluxo de bytes recebe uma indicação do sistema operacional sobre quando o programa alcança o final do fluxo(arquivo). 9 Arquivo e Fluxo ◼ Tipos de Fluxos de Arquivos: Fluxos baseados em bytes –representam dados no formato binário. ◼ Arquivos binários –criados a partir de fluxos baseados em bytes, lidos por um programa que converte os dados em formato legível por humanos. Fluxos baseados em caracteres – armazenam os dados como uma sequência de texto(caracteres). ◼ Arquivos de texto –criados a partir de fluxos baseados em caracteres, eles podem ser lidos por editores de textos. 10 Organização de Arquivo ◼ As operações básicas que podem ser feitas em um arquivo através de um programa são: obtenção de um registro do arquivo(consulta), inserção de um novo registro, modificação de um registro. exclusão de um registro. ◼ Dependendo do tipo de problema, estas operações poderão ocorrer em maior ou menor número. 11 Organização de Arquivo ◼ A disposição dos registros no arquivo pode favorecer determinadas operações em detrimento de outras. O conhecimento das possibilidades de organização dos registros no arquivos permite ao programador escolher aquela que seja mais adequada à solução do seu problema em termos de eficácia e eficiência. ◼ Basicamente, existem duas possibilidades de organização de arquivo: organização texto, na qual os registros são obtidos ou inseridos no arquivo em ordem sequencial; organização binária, em que o acesso do registro é feito em ordem aleatória. 12 Arquivo Texto ◼ A principal característica é a de que os dados são armazenados contiguamente, isto é um após o outro. ◼ Como consequência, o acesso aos registros do arquivo, tanto na leitura quanto na escrita são feitos sequencialmente, ou seja, a leitura de um registro só é possível após a leitura de todos os registros anteriores e a escrita de um registro só é feita após o ultimo registro. ◼ Um arquivo do tipo texto, também conhecido por arquivo sequencial, é um tipo especial de arquivo que, ao contrário do arquivo binário, pode ser editado normalmente através de um editor de textos qualquer. Ele é dito sequencial porque a leitura tem que ser feita sequencialmente do início ao fim do arquivo. ◼ Nos arquivos do tipo texto, todas as informações lá armazenadas são texto (char), mesmo assim, é possível escrever no arquivo informações de qualquer tipo de dado simples (int, float) as quais, ao serem fisicamente armazenadas no arquivo, serão automaticamente convertidas do seu tipo original para o tipo Literal. Na leitura da informação em um arquivo texto, a mesma precisa ser convertida para o tipo da variável necessário para o restante do processamento. 13 Arquivo Texto LINHA1 LINHA2 LINHA NUMERO 3 LINHA NUMERO QUATRO ARQUIVO.TXT Use o bloco de notas ou outro editor de arquivos tipo texto para editar o arquivo. 14 Entrada e Saída(I/O) ◼ A linguagem C++ possui uma biblioteca padrão que foi criada seguindo os princípios da programação orientada a objetos. Desta forma vários objetos já estão prontos para serem utilizados e incorporados. ◼ A biblioteca para entrada e saída (I/O) possui uma série de classes que permitem adicionar uma série de funcionalidades aos programas escritos em C++ ◼ A biblioteca de entrada e saída(I/O) utilizada pelo C++ simplifica a sintaxe em relação ao C tradicional ◼ Para entrada e saída e utilizado o conceito de uma Stream/Fluxo de bytes. ◼ Para utilizar a biblioteca de I/O para saída padrão utilize o include: #include <iostream> Para utilizar a biblioteca de I/O para saída em arquivo utilize o include: #include <fstream> 15 Entrada e Saída(I/O) ◼ O conceito de Stream pode ser entendido como um fluxo de informação que pode entrar ou sair de um programa para uma fonte de informação que pode ser um arquivo, a memória, o teclado ou o vídeo ◼ Desta forma a escrita para qualquer um destes meios utiliza-se basicamente a mesmas classes, facilitando seu uso: 16 Fluxos de Entrada e Saída(I/O) ◼ Há várias fontes de onde se desejar ler ou destinos para onde se deseja gravar ou enviar dados. arquivos conexões de rede console ( teclado / tela) memória ◼ Formas diferentes de ler/escrever sequencialmente /aleatoriamente como bytes / como caracteres linha por linha / palavra por palavra, ... ◼ APIs C++ para I/O oferecem objetos que abstraemfontes/destinos (nós) e fluxos de bytes e caracteres 17 Entrada e Saída(I/O) ◼ O buffer consiste em uma área de memória onde as informações são lidas ou escritas. ◼ O acesso ao buffer ocorre na velocidade da RAM enquanto os dispositivos de O acesso ao buffer ocorre na velocidade da RAM enquanto os dispositivos de entrada e saída (teclado; disco; etc.) trabalham em uma velocidade de acesso muito menor. ◼ Quando parte de um arquivo é necessária, normalmente um maior volume de informações e lido e transferido para o buffer, quando uma próxima parte desta informação é necessária o seu conteúdo já se encontra no buffer. ◼ A utilização de um buffer reduz o número de acessos necessários a disco, por exemplo, e desta forma este tipo de i/o é mais eficiente. ◼ Em C+ + existem buffers do tipo “Unit-buffering” e “Full buffering”. ◼ O primeiro tipo armazena a informação em linhas o segundo tipo armazena várias linhas até que as mesmas sejam removidos da memória (flush) 18 C++ Entrada e Saída(I/O) ◼ Algumas Classes Classe de Saída Objetos Descrição ostream cout, cerr, clog Saída em console ofstream Saída em arquivo em disco ostrstream Saída bufferizada em string Classe de Entrada Objetos Descrição istream cin Entrada em console ifstream Entrada em arquivo em disco Istrstream Entrada bufferizada em string 19 C++ Entrada e Saída(I/O) ◼ A classe ifstream e ofstream trabalha com entrada de dados e saída de dados respectivamente.. ◼ Você pode usar a class fstream que permite trabalhar tanto com leitura como escrita. Possui implementações do write e read simultaneamente. Normalmente, classes que começam com “i” – input; “o” - output ◼ O acesso a um arquivo dentro do programa deve ser feito de forma semelhante a uma variável. No programa, o arquivo deve ser declarado e aberto, antes que tal acesso possa ser realizado a escrita ou leitura. E no final do programa ou sub-rotina que fez a abertura o seu fechamento. 20 #include <iostream> #include <cstdlib> #include <fstream> using namespace std; int main(int argc, char *argv[]){ ofstream arquivo; //Processamento return EXIT_SUCCESS; } Arquivo Texto - Declaração para escrita Include fstream para trabalhar com arquivo. ofstream classe que manipula fluxo de saída/escrita através da referência interna “arquivo”. ifstream classe que manipula fluxo de entrada/leitura. 21 Arquivo Texto - Parâmetros Abertura ◼ A abertura de um arquivo é feita através do método open. ◼ Alguns parâmetros são necessários. Nome do arquivo a ser aberto E um ou mais parâmetros abaixo concatenados com |. Parâmetro Origem Função in input Abre um arquivo existente para leitura. out output Cria e abre um novo arquivo; se o arquivo já existe, todos seus dados são apagados. binary binary Executa operações no modo binário ao invés de texto. (default é texto) ate at end A posição de saída no final do arquivo.(Leitura e gravação) app append Abre um arquivo existente, posicionando o ponteiro do arquivo no final, permitindo adicionar linhas (os dados já existentes não são modificados) trunc truncate Qualquer conteúdo que exista no arquivo antes de ser aberto será descartado. 22 Arquivo Texto - Abertura para escrita #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ofstream arquivo; arquivo.open("ARQUIVO.TXT", fstream::out); if (arquivo.is_open()) { //Processamento } else { cout << "Arquivo não pode ser aberto"; } return EXIT_SUCCESS; } O parâmetro fstream::out cria e abre arquivo chamado “ARQUIVO.TXT” para escrita. Dados do arquivo já existente são apagados. O método is_open() verifica se o arquivo foi aberto e pode ser utilizado. Erros que podem ocorrer na abertura de arquivos podem ser a falta do arquivo, falta de permissão ou quando não há mais espaço em disco. 23 #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ofstream arquivo; arquivo.open("ARQUIVO.TXT", fstream::app); if (arquivo.is_open()){ arquivo << "Uma linha" << endl; arquivo << "Uma outra linha." << endl; } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Arquivo Texto - Escrevendo O método close() é chamado depois de enviar o texto. É utilizado o << da mesma forma que o texto enviado para o console. Abre arquivo chamado “ARQUIVO.TXT” para escrita e adiciona os dados ao final. Dados do arquivo já existente não são apagados. O endl forçar a gravação dos dados em disco e insere um caracter de fim-de-linha (´\n´) ele descarrega (ou esvazia) (flush) o buffer de saída no mesmo. 24 #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; const char NOME_ARQUIVO[] = "AGENDA.TXT"; int main(int argc, char *argv[]){ ofstream arquivo; cout << "Adicionar novos dados no arquivo existente? (S-Sim/N-Não):"; char adicionar = getchar(); if (adicionar =='S'){ arquivo.open(NOME_ARQUIVO,ios::app); } else { arquivo.open(NOME_ARQUIVO); } if (arquivo.is_open()) { char nome[80]; cout << "Digite um nome ou ENTER para sair:"; fflush(stdin); gets(nome); while (nome[0]!='\0') { //Envia o nome para o arquivo arquivo << nome << endl; cout << "Digite um nome ou ENTER para sair:"; fflush(stdin); gets(nome); } } else { cout << "Arquivo não pode ser aberto" ; } arquivo.close(); return EXIT_SUCCESS; } Abre um arquivo existente para adicionar novos dados ou cria um novo. Enquanto não for digitado um nome que seja NULO armazena os nomes no arquivo. Arquivo Texto - Escrevendo 25 Arquivo Texto - Declaração para Leitura #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ifstream arquivo; //Processamento return EXIT_SUCCESS; } Include fstream para trabalhar com arquivo. ifstream classe que manipula fluxo de entrada/leitura através da referência interna “arquivo”. 26 Arquivo Texto - Abertura para leitura #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ Ifstream arquivo; arquivo.open("ARQUIVO.TXT", ios::in); if (arquivo.is_open()) { //Processamento } else { cout << "Arquivo não pode ser aberto"; } return EXIT_SUCCESS; } O parâmetro ios::in abre arquivo chamado “ARQUIVO.TXT” para leitura. Erros que podem ocorrer na abertura de arquivos e podem ser o arquivo não existe, falta de permissão ou quando não há mais espaço em disco. O método is_open() verifica se o arquivo foi aberto e pode ser utilizado. 27 #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open("ARQUIVO.TXT",ios::in); if (arquivo.is_open()) { //Processamento char linha[80]=""; arquivo >> linha; cout << "Linha 1:" << linha << endl; arquivo >> linha; cout << "Linha 2:" << linha << endl; } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Arquivo Texto - Lendo Vetor de char O método close() é chamado depois de enviar o texto. É utilizado o >> da mesma forma que o texto lido do teclado. A leitura está sendo armazenado na variável linha. Abre arquivo chamado “ARQUIVO.TXT” para leitura. O cout está exibindo o conteúdo da variável linha. 28 Arquivo Texto - Leitura 1 Vetor de char com eof #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; const char NOME_ARQUIVO[] = "AGENDA.TXT"; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open(NOME_ARQUIVO,ios::in); if (arquivo.is_open()){ char nome[80]=""; while (!arquivo.eof()) { arquivo >> nome; cout << "Nome:" << nome << endl; } } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Enquanto não for fim do arquivo. Realiza a leitura de um nome. Escreve na tela o nome lido. Nome1 Nome dois Nome do Numero tres AGENDA.TXT 29 Arquivo Texto - Leitura 2 Vetor de char com ‘\0’ #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; const char NOME_ARQUIVO[] = "AGENDA.TXT"; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open(NOME_ARQUIVO,ios::in); if (arquivo.is_open()) { char nome[80]=""; arquivo.getline(nome,80); while (nome[0]!='\0') { cout << "Nome:" << nome << endl; arquivo.getline(nome,80); } } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Enquanto não for NULO faça Realiza a leitura de 80 caracteres da próxima linha. Escreve na tela o nome lido. Nome1 Nome dois Nome do Numero três AGENDA.TXT Realiza a leitura de 80 caracteres da primeira em linha. 30 Arquivo Texto - Leitura 1 string com eof #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; const char NOME_ARQUIVO[] = "AGENDA.TXT"; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open(NOME_ARQUIVO,ios::in); if (arquivo.is_open()) { string nome = ""; while (!arquivo.eof()) { getline(arquivo,nome); cout << "Nome:" << nome << endl; } } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Enquanto não fim do arquivo Escreve na tela o nome lido. Realiza a leitura da linha. Nome1 Nome dois Nome do Numero três AGENDA.TXT 31 Arquivo Texto - Leitura 2 string com “” #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; const char NOME_ARQUIVO[] = "AGENDA.TXT"; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open(NOME_ARQUIVO,ios::in); if (arquivo.is_open()) { string nome = ""; getline(arquivo,nome); while (nome != "") { cout << "Nome:" << nome << endl; getline(arquivo,nome); } } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Enquanto não diferente de “” Realiza a leitura da próxima linha. Escreve na tela o nome lido. Nome1 Nome dois Nome do Numero três AGENDA.TXT Realiza a leitura da primeira linha. 32 Arquivo Binário ◼ Um arquivo do tipo binário é também conhecido por arquivo randômico, ou de acesso aleatório. Ele é caracterizado pelo fato de ser possível buscar uma determinada informação em qualquer posição que a mesma se encontre, sem haver a necessidade de se percorrer todo o arquivo até se alcançar a informação desejada. ◼ O acesso à informação(leitura) é direto sendo feito através da função seekg. ◼ O acesso à informação(escrita) é direto sendo feito através da função seekp. ◼ Um arquivo binário aberto pode sofrer tanto leitura com escrita de dados. A operação de escrita pode ser em qualquer parte do arquivo. Sendo feito em uma posição livre significa inclusão. Se for feita a inclusão em uma posição utilizada temos uma atualização. ◼ Para a exclusão de dados temos duas maneiras: a exclusão física, em que após a eliminação de um registro, os demais registros devem ser deslocados, e a exclusão lógica, em que os registros possuem um campo adicional, identificando se os mesmos estão ativos ou inativos, isto é, se foram excluídos. ◼ Durante nossas implementações com arquivo binário iremos utilizar a exclusão lógica. 33 Arquivo Binário ◼ Arquivo com 5 registros de 100 bytes 100 bytes 0 100 bytes 100 100 bytes 200 100 bytes 300 100 bytes 400 4 bytes 4 bytes 92 bytes (95 caracteres) int float char 34 Arquivo Binário - Declaração para escrita ◼ O acesso a um arquivo binário dentro do programa é feito da mesma maneira que a leitura e escrita de variáveis. No programa, o arquivo deve ser declarado e aberto, antes que tal acesso possa ser feito a leitura ou escrita. E no final do programa ou sub-rotina que fez a abertura o seu fechamento. #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ofstream arquivo; //Processamento return EXIT_SUCCESS; } Include fstream para trabalhar com arquivo. ofstream classe que manipula fluxo de saída/escrita através da referência interna “arquivo”. ifstream classe que manipula fluxo de entrada/leitura. 35 Arquivo Binário - Parâmetros Abertura ◼ A abertura de um arquivo é feita através do método open. ◼ Alguns parâmetros são necessários. Nome do arquivo a ser aberto E um ou mais parâmetros abaixo concatenados com |. Parâmetro Origem Função in input Abre um arquivo existente para leitura. out output Cria e abre um novo arquivo; se o arquivo já existe, todos seus dados são apagados. binary binary Executa operações no modo binário ao invés de texto. (default é texto) ate at end A posição de saída no final do arquivo.(Leitura e gravação) app append Abre um arquivo existente, posicionando o ponteiro do arquivo no final, permitindo adicionar linhas (os dados já existentes não são modificados) trunc truncate Qualquer conteúdo que exista no arquivo antes de ser aberto será descartado. 36 Arquivo Binário - Abertura para escrita #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ofstream arquivo; arquivo.open("ARQUIVO.DAT",ios::out|ios::binary); if (arquivo.is_open()) { //Processamento } else { cout << "Arquivo não pode ser aberto"; } return EXIT_SUCCESS; } O parâmetro ios::out cria e abre arquivo chamado “ARQUIVO.DAT” para escrita. Dados do arquivo já existente são apagados. Erros que podem ocorrer na abertura de arquivos e podem ser a falta do arquivo, falta de permissão ou quando não há mais espaço em disco. O método is_open() verifica se o arquivo foi aberto e pode ser utilizado. 37 #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ofstream arquivo; arquivo.open("ARQUIVO.DAT",ios::out|ios::binary); if (arquivo.is_open()) { int numint; float numfloat; char linha[92]; cout << "Digite um número inteiro: "; cin >> numint; cout << "Digite um número real: "; cin >> numfloat; cout << "Digite uma literal (até 92 caracteres):"; fflush(stdin); gets(linha); arquivo.write((char*)&numint,sizeof(numint)); arquivo.write((char*)&numfloat,sizeof(numfloat)); arquivo.write((char*)&linha,sizeof(linha)); } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Arquivo Binário - Escrevendo O método close() é chamado depois de enviar os dados. Leitura dos valores a serem armazenados no arquivo binário. Abre arquivo chamado “ARQUIVO.DAT” para escrita e adiciona os dados ao final. Dados do arquivo já existente são apagados. write escreve o conteúdo das variáveis como char de acordo com o tamanho da variável declarada(sizeof). 38 Arquivo Texto - Escrita #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; struct pessoa { char nome[96]; int idade; }; int main(int argc, char *argv[]){ ofstream arquivo; //Saida arquivo.open("AGENDA.DAT",ios::out|ios::binary|ios::app); if (arquivo.is_open()) { pessoa reg; cout << "Digite um nome ou ENTER para sair:"; fflush(stdin); gets(reg.nome); while (reg.nome[0]!='\0'){ cout << "Digite a Idade:"; cin >> reg.idade; arquivo.seekp(0,arquivo.end); arquivo.write((char*)®, sizeof(pessoa)); cout << "Digite um nome ou ENTER para sair:"; fflush(stdin); gets(reg.nome); } } else{ cout << "Arquivo não pode ser aberto: " << arquivo.rdstate(); } arquivo.close(); return EXIT_SUCCESS; } Abre um arquivo existente e permite adicionar novos registros. Enquanto nome for diferente de NULO armazena os nomes no arquivo. Arquivo Binário - Escrevendo Agrupa os dados na struct pessoa para facilitar o armazenamento. Usa seekp para posicionar no final do arquivo para escrever o novo registro. 39 Arquivo Binário - Escrita ◼ Neste exemplo de escrita de registros de pessoa no arquivo “AGENDA.DAT” ocorre sempre no fim do arquivo. ◼ Para se realizar a escrita sempre no fim é necessário utilizar o comando seekp combinado com o ponteiro de final de arquivo ios::end. ◼ Se desejar saber onde está o ponteiro utilize o método tellp para retornar a posição de escrita. ◼ Ponteiros no arquivo: ios::beg - início do stream. ios::cur - posição corrente no stream. ios::end - fim do stream. 40 Arquivo Binário - Escrita ◼ No exemplo anterior e gravação de registros de pessoa no arquivo “AGENDA.DAT” ocorre sempre no final do arquivo. ◼ Repare que a abertura posicionou o ponteiro de gravação no final através de ios::app. 41 Arquivo Binário - Declaração para Leitura #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ifstream arquivo; //Processamento return EXIT_SUCCESS; } Include fstream para trabalhar com arquivo. ifstream classe que manipula fluxo de entrada/leitura através da referência interna “arquivo”. 42 Arquivo Binário - Abertura para leitura #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open("ARQUIVO.DAT",ios::in|ios::binary); if (arquivo.is_open()) { //Processamento } else { cout << "Arquivo não pode ser aberto"; } return EXIT_SUCCESS; } O parâmetro ios::in abre arquivo chamado “ARQUIVO.DAT” para leitura. Erros que podem ocorrer na abertura de arquivos e podem ser a falta do arquivo, falta de permissão ou quando não há mais espaço em disco. O método is_open() verifica se o arquivo foi aberto e pode ser utilizado. 43 #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open("ARQUIVO.DAT",ios::in|ios::binary); if (arquivo.is_open()) { int numint; float numfloat; char linha[92]; arquivo.read((char*)&numint,sizeof(numint)); cout << "Número inteiro: " << numint << endl; arquivo.read((char*)&numfloat,sizeof(numfloat)); cout << "Número real: " << numfloat << endl; arquivo.read((char*)&linha,sizeof(linha)); cout << "Literal (até 92 caracteres): " << linha << endl; } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Abre arquivo chamado “ARQUIVO.DAT” para leitura. O cout está exibindo o conteúdo da variáveis lidas. Arquivo Binário - Lendo read lê o conteúdo dos arquivos para as variáveis como char de acordo com o tamanho da variável declarada(sizeof). O método close() é chamado depois de ler os dados. 44 Arquivo Binário - Leitura ◼ Neste exemplo de leitura de registros de pessoa no arquivo “AGENDA.DAT” ocorre sempre a partir do primeiro registro do arquivo até o fim. ◼ Logo após a abertura do arquivo o mesmo é posicionado no fim do arquivo encontra na posição ios::end utilizando o método seekg para retornar o tamanho do arquivo. ◼ Depois é posicionado no primeiro registro que se encontra na posição 0 utilizando o método seekg e o ponteiro ios::beg. ◼ Para se realizar a leitura de todos os registros é necessário utilizar o comando seekg combinado com o comando tellg. A estrutura de repetição faz com que seja lidos registros enquanto o comando tellg retornar a posição de leitura atual menor que o tamanhoArquivo. ◼ Atenção: Não é necessário posicionar o ponteiro para a próxima leitura pois após a leitura de um registro o ponteiro se posiciona no inicio do próximo e assim por diante. ◼ Ponteiros no arquivo: ios::beg - início do stream. ios::cur - posição corrente no stream. ios::end - fim do stream. 45 Posicionamento 46 #include <iostream> //cout, endl #include <cstdlib> //EXIT_SUCCESS #include <fstream> using namespace std; struct pessoa { char nome[96]; int idade; }; int main(int argc, char *argv[]){ ifstream arquivo; arquivo.open("AGENDA.DAT",ios::in|ios::binary); if (arquivo.is_open()){ pessoa reg; arquivo.seekg(0,arquivo.end); //Posiciona no final do arquivo int tamanhoArquivo = arquivo.tellg(); //Retorna o tamanho do arquivo arquivo.seekg(0,arquivo.beg); //posiciona no inicio do arquivo para leitura while(arquivo.tellg() < tamanhoArquivo ) { arquivo.read((char*) ®, sizeof(pessoa)); cout << "Nome:" << reg.nome << " Idade:"<< reg.idade << endl; } } else { cout << "Arquivo não pode ser aberto"; } arquivo.close(); return EXIT_SUCCESS; } Enquanto não for fim do arquivo. Realiza a leitura de um registro. Escreve na tela os dados do registro lido. Arquivo Binário - Lendo O método tellg retorna a posição de leitura em bytes do arquivo. O método seekg posiciona o ponteiro de leitura em uma posição do final(end) do arquivo. 47 Conclusão ◼ Persistir dados é necessário, caso contrário sempre teremos que digitar dos dados de entrada a cada processamento ou executar uma entrada para ter os dados de saída. ◼ Arquivos é a opção para armazenamento de dados sem a utilização de grandes recursos. ◼ Defina sua necessidade de armazenamento e operações para identificar se é necessário um arquivo texto ou binário. 48 Bibliografia/Referências ◼ Stroustrup, Bjarne. The C++ Programming Language. 2019. Disponível em: “http://www.stroustrup.com/C++.html” 49 Fim
Compartilhar