Leitura e gravação de arquivos 


Exemplo de programa que somente lê registros a um arquivo existente

// programa retirado em jan/2004 do endereço abaixo, com pouquíssimas alterações
//http://wwwsr.unijui.tche.br/~sandro/MatDid/LingIII/MatDid-LingIII.htm
#include <iostream.h> 
#include <stdlib.h> 
#include <math.h> 
#include <stdio.h> 
#include <conio.h> 
#include <cstring> 
int transf_num(void)
{int y;
char le_num[4];
y=atoi(gets(le_num)); //a função atoi converte string para inteiro
return(y); //a função atoi converte string para inteiro

struct alunos{ 
int rg; 
char nome[50]; 
int nota; 
}; 
void main(void)

FILE *arquivo;
struct alunos aluno;
int OK, rg_tmp, nota_tmp;
cout<<"Este le e mostra dados ( RG, nome e nota) de um arquivo \n"; arquivo=fopen("alunos.dat","r+b"); /* abrindo arquivo existente */
if(arquivo==NULL) { fprintf(stderr,"O arquivo inexistente "); } while(fread(&aluno,sizeof(aluno),1,arquivo)==1 && !feof(arquivo)) 
{
printf("%04d %-30s %4d\n",aluno.rg,aluno.nome,aluno.nota);
}
fclose(arquivo); 
getch();
}

Exemplo de programa que acrescenta registros a um arquivo existente

// programa retirado em jan/2004 do endereço abaixo, com pouquíssimas alterações
//http://wwwsr.unijui.tche.br/~sandro/MatDid/LingIII/MatDid-LingIII.htm
#include <iostream.h> 
#include <stdlib.h> 
#include <math.h> 
#include <stdio.h> 
#include <conio.h> 
#include <cstring> 
int transf_num(void)
{int y;
char le_num[4]; 
y=atoi(gets(le_num)); //a função atoi converte string para inteiro
return(y); //a função atoi converte string para inteiro


struct alunos{ 
int rg; 
char nome[50]; 
int nota; 
}; 

void main(void) 

FILE *arquivo; 
struct alunos aluno; 
int OK, rg_tmp, nota_tmp; 
cout<<"Este programa grava dados ( RG, nome e nota) em arquivo \n";
cout<<"\n Apos entrar com o ultimo registro de aluno, coloque 0(zero) para RG\n";
arquivo=fopen("alunos.dat","r+b"); // abrindo arquivo para gravaçã0 
if(arquivo==NULL){ // SE NAO CONSEGUIR CRIA O ARQUIVO 
arquivo = fopen("alunos.dat","w+b"); 
if(arquivo==NULL){ 
fprintf(stderr,"Nao consegui criar o arquivo"); 
exit(1); 


do{ 
printf("RG : "); 
rg_tmp = transf_num(); 
if(rg_tmp==0) break; //opcao de para sair de do{... }while
rewind(arquivo); // Vai para o início 
OK = 0; 
while(fread(&aluno,sizeof(aluno),1,arquivo)==1 && !feof(arquivo)) 
{
if(aluno.rg==rg_tmp){ 
printf("Rg ja cadastrado. Tecle Algo...\n"); 
getch(); 
OK = 1; 
break; 


}//fim do while {}
if(!OK){ 
aluno.rg = rg_tmp; 
printf("Nome.. : "); 
gets(aluno.nome); 
printf("Nota.: "); 
nota_tmp = transf_num(); 
aluno.nota=nota_tmp;

fseek(arquivo,0L,SEEK_END); // Vai para o final 
fwrite(&aluno,sizeof(aluno),1,arquivo); 

}while(1); 
// Para ler dados ja gravados em arquivo já aberto

fclose(arquivo); 
getch(); 




Exemplo de programa que lê e acrescenta registros a um arquivo existente

// programa retirado em jan/2004 do endereço abaixo, com pouquíssimas alterações
//http://wwwsr.unijui.tche.br/~sandro/MatDid/LingIII/MatDid-LingIII.htm
#include <iostream.h> 
#include <stdlib.h> 
#include <math.h> // 
#include <stdio.h> 
#include <conio.h> 
#include <cstring> 

int transf_num(void)
{int y;
char le_num[4]; 
y=atoi(gets(le_num)); //a função atoi converte string para inteiro
return(y); //a função atoi converte string para inteiro


struct alunos{ 
int rg; 
char nome[50]; 
int nota; 
}; 

void main(void) 


FILE *arquivo; 
struct alunos aluno; 
int OK, rg_tmp, nota_tmp; 

cout<<"Este programa grava, le e mostra dados ( RG, nome e nota) de um arquivo \n";
cout<<"\n Apos entrar com o ultimo registro de aluno, coloque 0(zero) para RG\n";

arquivo=fopen("alunos.dat","r+b"); /* abrindo arquivo para gravação */ 


if(arquivo==NULL){ /* SE NAO CONSEGUIR CRIA O ARQUIVO */ 
arquivo = fopen("alunos.dat","w+b"); 
if(arquivo==NULL){ 
fprintf(stderr,"Nao consegui criar o arquivo"); 
exit(1); 


do{ 
printf("Rg : "); 
rg_tmp = transf_num(); 
if(rg_tmp==0) break; //opcao de para sair do do{... }while
rewind(arquivo); /* Vai para o início */ 
OK = 0; 
while(fread(&aluno,sizeof(aluno),1,arquivo)==1 && !feof(arquivo)) 
{
if(aluno.rg==rg_tmp){ 
printf("Rg ja cadastrado. Tecle Algo...\n"); 
getch(); 
OK = 1; 
break; 


}//fim do while {}
if(!OK){ 
aluno.rg = rg_tmp; 
printf("Nome.. : "); 
gets(aluno.nome); 
printf("Nota.: "); 
nota_tmp = transf_num(); 
aluno.nota=nota_tmp;

fseek(arquivo,0L,SEEK_END); /* Vai para o final */ 
fwrite(&aluno,sizeof(aluno),1,arquivo); 

}while(1); // 
/* Para ler dados ja gravados em arquivo já aberto*/

rewind(arquivo); /* Vai para o início */
while(fread(&aluno,sizeof(aluno),1,arquivo)==1 && !feof(arquivo)) 
{
printf("%04d %-30s %4d\n",aluno.rg,aluno.nome,aluno.nota); 
}
fclose(arquivo); 
getch(); 
}

Descrição das instruções que aparecem nos códigos dos programas que envolvem arquivo de dados.
Fonte:http://wwwsr.unijui.tche.br/~sandro/MatDid/LingIII/MatDid-LingIII.htm

A instruão para abrir um arquivo tipo texto ou binário é da forma:
Desta instrução retorna NULL no caso haja algum problema para abrir o arquivo. 
FILE *fopen( char *arquivo, char *modo); 
Na instrução de abertura de arquivo acima onde consta *modo deve-se utilizar uma das alternativas:
"r" somente para leitura; 
"+r" para leitura e escrita; 
"w" para criar um novo arquivo para escrita. Se o arquivo já existir este será eliminado e recriado; 
"a" para acrescentar registros no final do arquivo (append);

"b" para indicar que o arquivo é um binário;
"t" Arquivo tipo texto. (Linha finalizadas com '\n' e arquivo com EOF) 

Alteração da posição do ponteiro de um arquivo 
Retorna 0 se não houverem problemas. 

int fseek(FILE *arquivo,long deslocamento, int inicio); 
arquivo: Ponteiro FILE para um arquivo aberto anteriormente por fopen(). 
deslocamento: Numero de bytes a deslocar, relativos a inicio. Deve ser um inteiro positivo. 
inicio: Define o ponto inicial do deslocamento. 
Para o parâmetro inicio, pode ser uma das seguintes macros definidas em stdio.h: 
SEEK_SET Posiciona a partir do inicio do arquivo. 
SEEK_CUR Relativo a posição atual. 
SEEK_END Retrocede do final do arquivo. 
Por exemplo: 
fseek(arquivo,10L,SEEK_SET); /* Posiciona no 10º byte do inicio do arquivo.
fseek(arquivo,sizeof(float),SEEK_CUR); /* Avanca 4 bytes. */ 

Instrução que escreve bytes em um arquivo
A função fwrite retorna o número de itens realmente gravados e avança o ponteiro de arquivo tamanho*num bytes
Se o ponteiro estiver apontando a uma área já gravada do arquivo, então os novos dados irão sobrescrever os anteriores.
Se estiver apontando para o final do arquivo então os os novos dados serão anexados
int fwrite(void *buffer, int tamanho, int num, FILE *arquivo) 
Os argumentos de fwrite que aparecem na instrução são: 
buffer : Ponteiro para uma área de memória, geralmente uma estrutura ou um vetor, onde estão armazenados os dados a serem gravados no arquivo. 
tamanho: Numero de bytes a gravar. Geralmente sizeof(buffer). 
num : Numero de itens a gravar. Geralmente 1. 
arquivo: Ponteiro FILE para um arquivo aberto anteriormente por fopen(). 

Instrução que Lê bytes de um arquivo e armazena-os na posição de memória apontada por buffer. 
A função retorna o número de itens realmente lidos e avança o ponteiro de arquivo 
int fread(void *buffer, int tamanho, int num, FILE *arquivo); 
buffer : Ponteiro para uma área de memória, geralmente uma estrutura ou um vetor, onde serão armazenados os dados lidos do arquivo. 
tamanho: Numero de bytes a ler. Geralmente sizeof(buffer). 
num : Numero de itens a ler. Geralmente 1. 
arquivo: Ponteiro FILE para um arquivo aberto anteriormente por fopen().