Escolar Documentos
Profissional Documentos
Cultura Documentos
continuação
1
1 INF 01202 - Prof. Marcelo Walter – Aula 25
Leitura/Gravação em arquivos
ftell(point_arq)
...
FILE *arq;
arq = fopen(...);
...
}
....
Obs.: veja que o
contador usado na
opção 1 não é
necessário
/*
Cria um arquivo com dados de uma estrutura
com informações de atletas, de forma randômica.
*/
#include <stdio.h>
#include <string.h>
#define MAXCOD 10 // codigos dos atletas entre 1 e 10
#define MAXNOME 16 // tamanho do nome do arquivo
void listaarquivo(FILE*);
int main ( )
{
FILE *arq;
int encontrado = 0, op, cod;
char nome[MAXNOME], procurado[30];
TIPO_ATLETA buffer;
printf("Nome do arquivo: ");
gets(nome);
if(!(arq = fopen(nome,"w+b"))) //cria ou recria
printf("Erro criacao");
else
{
do
{
/* TRECHO DE CRIAÇÃO DO ARQUIVO NO SLIDE A SEGUIR*/
} while (op != 2);
listaarquivo(arq);
fclose(arq);
}
return 0;
}
18
18 INF 01202 - Prof. Marcelo Walter – Aula 25
Criação randômica do arquivo com dados de atletas: código
...
do
{ //coleta dados do usuário e os escreve
do
{ // lê código do atleta, consistindo:
printf("Codigo do atleta, entre 1 e %d: “, MAXCOD);
scanf("%d", &cod);
if (cod < 1 || cod > MAXCOD)
printf("\nCodigo deve estar entre 1 e %d!\n", MAXCOD);
} while (cod < 1 || cod > MAXCOD);
cod = cod - 1; // corrige para o índice de deslocamento no arquivo
printf("Nome: ");
fflush(stdin);
gets(buffer.nome); // lê nome
printf("Idade: ");
scanf("%d",&buffer.idade);
printf("Altura: ");
scanf("%f",&buffer.altura);
fseek(arq,cod*sizeof(TIPO_ATLETA),SEEK_SET);
fwrite(&buffer,sizeof(TIPO_ATLETA),1,arq);
fflush(arq); // força a gravação física (opcional, a gravaçao seria feita no fclose)
printf("\n1-InserirNovo, 2-Encerrar: ");
scanf("%d", &op);
} while(op != 2);
....
19
19 INF 01202 - Prof. Marcelo Walter – Aula 25
Criação randômica do arquivo com dados de atletas: exemplo de execução
Bytes associados a
campos não lidos são
gravados como
5 00000000 (binário).
Corresponde ao
caracter ‘\0’ quando
o byte é lido como um
char.
10
22 INF 01202 - Prof. Marcelo Walter – Aula 25
Listagem sequencial de cadastro gerado de forma randômica, mostrando
apenas registros preenchidos e código do atleta (associado à posição):
// Programa principal
int main(){
FILE *fpbin;
TIPO_CANDIDATO c;
int na=0, nb=0, nc=0;
int va=0, vb=0, vc=0;
int maior_votos=-1;
char nome_mais_votado[30];
char partido_mais_votado;
if (fpbin!=NULL){
while(!feof(fpbin)){
if (fread(&c,sizeof(TIPO_CANDIDATO),1,fpbin) == 1){
// encontra candidato mais votado
if (c.nro_votos > maior_votos){
strcpy(nome_mais_votado, c.nome);
partido_mais_votado = c.partido;
maior_votos = c.nro_votos;
}
switch(c.partido){
case 'A': na++; va += c.nro_votos; break;
case 'B': nb++; vb += c.nro_votos; break;
case 'C': nc++; vc += c.nro_votos; break;
}
}
printf("Candidato mais votado: %s do partido %c\n", nome_mais_votado,
partido_mais_votado);
printf("Numero de candidatos:\n Partido A %d\n Partido B %d\n Partido C %d\n”,
na,nb, nc);
printf("Totais de votos:\n Partido A %d\n Partido B %d\n Partido C %d\n", va,vb, vc);
fclose(fpbin);
}
else printf("Problema para abertura do arquivo binario!\n");
return
27 0; INF 01202 - Prof. Marcelo Walter – Aula 25
}