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().