13 Gravação e Leitura em Arquivos Texto e Binário
13.2 Exemplos
// Cria arquivo "teste.txt" e escreve o caracter "a" #include <iostream>
#include <stdio.h> using namespace std; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
char ch = 'a';
// Abre ou cria o arquivo "teste.txt" para gravação. if ((fp = fopen("teste.txt", "w")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Escreve o caracter no arquivo putc(ch , fp); // Fecha o arquivo fclose(fp); } Arquivo texte.txt: a
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 52 // Abre o arquivo "teste.txt", le o caracter e exibe na tela
#include <iostream> #include <stdio.h> using namespace std; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
char ch;
// Abre o arquivo "teste.txt" para leitura. if ((fp = fopen("teste.txt", "r")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Le o caracter no arquivo e atribui a ch ch = getc(fp);
// Exibe o caracter lido cout << ch; // Fecha o arquivo fclose(fp); } Resultado: a
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 53 // Abre o arquivo "teste.txt" e acrescenta o caracter "b"
#include <iostream> #include <stdio.h> using namespace std; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
char ch = 'b';
// Abre o arquivo "teste.txt" para acrescimo. if ((fp = fopen("teste.txt", "a")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Escreve o caracter no arquivo putc(ch , fp); // Fecha o arquivo fclose(fp); } Arquivo texte.txt: ab
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 54 Arquivo texte.txt:
abcde
Programa:
// Abre o arquivo "teste.txt", le os caracteres e exibe na tela #include <iostream>
#include <stdio.h> using namespace std; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
char ch;
// Abre o arquivo "teste.txt" para leitura. if ((fp = fopen("teste.txt", "r")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Le o arquivo ate que seja retornado o seu fim while (!feof(fp)) {
// Le o caracter no arquivo e atribui a ch ch = getc(fp);
// Exibe o caracter lido cout << ch; } // Fecha o arquivo fclose(fp); } Resultado: abcde
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 55 // Abre o arquivo "teste.txt", escreve "abcde", exibe a primeira e quarta // posicao e apaga o arquivo
#include <iostream> #include <stdio.h> using namespace std; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
// Array de char com 5 posicoes preechidas char texto[5] = {'a','b','c','d','e'}; char ch;
// Abre o arquivo "teste.txt" para leitura. if ((fp = fopen("teste.txt", "w+")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Grava o array texto no arquivo
// Apos isso, o indicador de posição do arquivo fica no final fwrite(&texto, sizeof(texto), 1, fp);
// Recoloca o indicador de posição do arquivo no início do arquivo rewind(fp);
// Le e exibe o caracter do inicio do arquivo ch = getc(fp);
cout << ch;
// Posiciona o indicador na posição 3 do arquivo a partir do início // A primeira posicao é o 0
fseek(fp, 3, SEEK_SET);
// Le e exibe o caracter da posicao atual do arquivo ch = getc(fp); cout << ch; // Apaga o arquivo remove("teste.txt"); // Fecha o arquivo fclose(fp); } Resultado: ad
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 56
// Abre o arquivo binario "teste.dat", grava um conteudo, le do arquivo e exibe na tela // Contém verificação na gravação e na leitura do arquivo
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; struct tipo_registro { int codigo; string nome; double valor; }; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
// Cria os registros para gravacao e posterior leitura tipo_registro registro_gravado;
tipo_registro registro_lido;
// Cria o arquivo binário "teste.dat" para leitura e/ou gravacao if ((fp = fopen("teste.dat", "wb+")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Atribui valores ao conteudo de registro_gravado registro_gravado.codigo = 10;
registro_gravado.nome = "Cliente10"; registro_gravado.valor = 100.10;
// Exibe o conteudo do registro_gravado
cout << "--Registro a ser gravado no arquivo teste.dat--" << endl; cout << registro_gravado.codigo << " " << registro_gravado.nome << " " << registro_gravado.valor << endl;
// Grava o registro_gravado no arquivo binário
if (fwrite(®istro_gravado, sizeof(struct tipo_registro), 1, fp)!=1){ // Caso não seja possível, exibe
cout << "Nao foi possivel gravar no arquivo \n"; // Encerra a execução
exit(1); }
// Recoloca o indicador de posição do arquivo no início do arquivo rewind(fp);
// Le o registro_gravado do arquivo binário e armazena no // registro_lido
if (fread(®istro_lido, sizeof(struct tipo_registro), 1, fp)!=1){ // Caso não seja possível, exibe
cout << "Nao foi possivel ler do arquivo \n"; // Encerra a execução
exit(1); }
// Exibe o conteudo do registro_lido
cout << "--Registro lido do arquivo teste.dat--" << endl;
cout << registro_lido.codigo << " " << registro_lido.nome << " " << registro_lido.valor << endl;
// Fecha o arquivo fclose(fp); }
Resultado:
--Registro a ser gravado no arquivo teste.dat-- 10 Cliente10 100.1
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 57
10 Cliente10 100.1
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 58
// Abre o arquivo binario "teste.dat", grava um array de conteudo, le do arquivo e exibe
// NÃO CONTÉM verificação na gravação e na leitura do arquivo
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; struct tipo_registro { int codigo; string nome; double valor; }; main(){
// Cria ponteiro do tipo arquivo (FILE) FILE *fp;
int tamanho_registro = 3;
// Cria os registros para gravacao e posterior leitura tipo_registro registro_gravado[tamanho_registro]; tipo_registro registro_lido[tamanho_registro];
// Cria o arquivo binário "teste.dat" para leitura e/ou gravacao if ((fp = fopen("teste.dat", "wb+")) == NULL){
// Caso não seja possível, exibe
cout << "Nao foi possivel abrir o arquivo \n"; // Encerra a execução
exit(1); }
// Atribui valores ao conteudo de registro_gravado registro_gravado[0].codigo = 10; registro_gravado[0].nome = "Cliente10"; registro_gravado[0].valor = 100.10; registro_gravado[1].codigo = 11; registro_gravado[1].nome = "Cliente11"; registro_gravado[1].valor = 100.11; registro_gravado[2].codigo = 22; registro_gravado[2].nome = "Cliente22"; registro_gravado[2].valor = 100.22; // Exibe o conteudo do registro_gravado
cout << "--Registro a ser gravado no arquivo teste.dat--" << endl; for (int i=0; i<tamanho_registro; i++){
cout << registro_gravado[i].codigo << " " << registro_gravado[i].nome << " " << registro_gravado[i].valor << endl;
}
// Grava o registro_gravado no arquivo binário
// Apos isso, o indicador de posição do arquivo fica no final for (int i=0; i<tamanho_registro; i++){
fwrite(®istro_gravado[i], sizeof(struct tipo_registro), 1, fp); }
// Recoloca o indicador de posição do arquivo no início do arquivo rewind(fp);
// Le o registro_gravado so arquivo binário e armazena no registro_lido for (int i=0; i<tamanho_registro; i++){
fread(®istro_lido[i], sizeof(struct tipo_registro), 1, fp); }
// Exibe o conteudo do registro_lido
cout << "--Registro lido do arquivo teste.dat--" << endl; for (int i=0; i<tamanho_registro; i++){
cout << registro_lido[i].codigo << " " << registro_lido[i].nome << " " << registro_lido[i].valor << endl;
}
// Fecha o arquivo fclose(fp);
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 59
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 60 Resultado:
--Registro a ser gravado no arquivo teste.dat-- 10 Cliente10 100.1
11 Cliente11 100.11 22 Cliente22 100.22
--Registro lido do arquivo teste.dat-- 10 Cliente10 100.1
11 Cliente11 100.11 22 Cliente22 100.22
Programação C++ professorgilbertoquirgodesouza@gmail.com Pág. 61
Referências
Cplusplus, Disponível em: http://www.cplusplus.com, último acesso em: 25 ago. 2010.
Deitel, H. M., Deitel, P. J., C++ : Como Programar, Ed. Bookman, 2006.
Horstman, C., Conceitos de Computação com o Essencial de C++, Ed. Bookman, 2005. Farrer, H., Algoritmos Estruturados, Ed. Guanabara, 1989.