Ir ao conteúdo
  • Cadastre-se

Duvida em leitura de arquivo com vetor e estrutura


sethph34r

Posts recomendados

Boa tarde.

estou precisando muito de ajuda, estou desenvolvendo um trabalho de faculdade que utiliza vetor e estruturas para criar um arquivo, ele se baseia em um pequeno cadastro, consigo cadastrar vários registros de uma vez e caso eu mande listar todos que eu cadastrei na mesma vez(sem fechar o programa) ele lista corretamente, porém se eu abrir o programa e pedir que ele liste logo de cara ele só em volta o primeiro registro, será que alguém teria a solução para ele mostrar todos os registros ao invés de só o primeiro?

Segue meu código:


#include<stdio.h>
#include<stdlib.h>

struct estrutura
{
char nome[30];
char end[20];
char cidade[20];
char estado[20];
char cep[10];
};
struct estrutura dados[10]; // matriz onde vão ficar as estruturas
int i=0, a=0; //controladores
FILE *fopen(),*p;
//////////////////////escrita//////////////////
cad_arq()
{

if((p = fopen("arq3.doc","w"))==NULL)
{
printf("erro na abertura do arquivo \n");
exit(0);
}

system("cls");
printf("Entre com o nome:");
fflush(stdin); // limpa o buffer do teclado porque não estava conseguindo fazer com
scanf("%[^\n]",&dados[a].nome);//fgets, [^\n] permite o fgets continuar depois de um "espaço", assim não tem problema dele ler outra ver depois que você digita espaço
printf("\n");
printf("Entre com o Endereço: ");
fflush(stdin);
scanf("%[^\n]",&dados[a].end);// grava no indice a, que começa com zero, então dados[0].end
printf("\n");
printf("Entre com a cidade: ");
fflush(stdin);
scanf("%[^\n]",&dados[a].cidade);
printf("\n");
printf("Entre com o estado: ");
fflush(stdin);
scanf("%[^\n]",&dados[a].estado);
printf("\n");
printf("Entre com o CEP: ");
fflush(stdin);
scanf("%[^\n]",&dados[a].cep);
printf("\n\n\n");

for(i=0; i<a; i++) // for para gravação no arquivo, ele vai executar toda vez que a função for chamada e vai jogar de 0 até o indice corrente de a que no começo também é zero
{
fwrite(dados[i].nome,30,1,p);
fwrite(dados[i].end,20,1,p);
fwrite(dados[i].cidade,20,1,p);
fwrite(dados[i].estado,20,1,p);
fwrite(dados[i].cep,20,1,p);
}
system("pause");


}
//////////////////leitura//////////////////////
*le_arq()
{
if((p = fopen("arq3.doc","r+"))==NULL)
{
printf("erro na abertura do arquivo \n");
exit(0);
}

printf("Dados do arquivo \n\n\n");
for(i=0; i<a; i++) // mesmo esquema do outro for, só que para leitura e apresentação
{
fread(&dados[i].nome,30,1,p);
fread(&dados[i].end,20,1,p);
fread(&dados[i].cidade,20,1,p);
fread(&dados[i].estado,20,1,p);
fread(&dados[i].cep,20,1,p);

printf("Nome: %s",dados[i].nome);
printf("\n\n");
printf("End: %s",dados[i].end);
printf("\n\n");
printf("Cidade: %s",dados[i].cidade);
printf("\n\n");
printf("Estado: %s",dados[i].estado);
printf("\n\n");
printf("CEP: %s",dados[i].cep);
printf("\n\n");
}
getchar();
getchar();
}

main()
{
int op=1;
while (op!=0)
{
system("cls");
printf(" Ecolha uma opcao ! \n\n");
printf("1-Gravar arquivos.\n");
printf("2- Ler arquivos. \n");
printf("0- Sair. \n");
printf("\n\n");
scanf("%d", &op);
printf("\n\n");

switch(op)
{
case 1:
{
cad_arq();
a=a+1; // depois que você adcionou um registro já coloca o indice da matriz no próximo
break;
}

case 2:
{
le_arq();
break;
}

case 0:
{
printf("fim de programa, obrigado \n");
break;
}

default:
{
printf("opcao incorreta");
break;
}

}
}
fclose(p);
system("pause");
}


grato desde já

Link para o comentário
Compartilhar em outros sites

A sua lógica está correta, o que faltou foi o tratamento para a leitura dinâmica do arquivo.

Segue modificação feita no código:


#include<stdio.h>
#include<stdlib.h>

struct estrutura
{
char nome[30];
char end[20];
char cidade[20];
char estado[20];
char cep[10];
};

struct estrutura listaDados[10]; // matriz onde vão ficar as estruturas
struct estrutura dados;

int i = 0, a = 0; //controladores

FILE *p;

//////////////////////escrita//////////////////
/**
Como o cadastro é sempre de um em um, portanto, nao precisa de um vetor
**/
void cad_arq(void)
{

if ( ( p = fopen("arq3.txt","a+") ) == NULL )
{
printf("erro na abertura do arquivo \n");
exit(0);
}

system("cls");

printf("Entre com o nome:");
fflush(stdin); // limpa o buffer do teclado porque não estava conseguindo fazer com
scanf("%[^\n]", dados.nome);//fgets, [^\n] permite o fgets continuar depois de um "espaço", assim não tem problema dele ler outra ver depois que você digita espaço
printf("\n");

printf("Entre com o Endereço: ");
fflush(stdin);
scanf("%[^\n]", dados.end );// grava no indice a, que começa com zero, então dados[0].end
printf("\n");

printf("Entre com a cidade: ");
fflush(stdin);
scanf("%[^\n]", dados.cidade );
printf("\n");

printf("Entre com o estado: ");
fflush(stdin);
scanf("%[^\n]", dados.estado);
printf("\n");

printf("Entre com o CEP: ");
fflush(stdin);
scanf("%[^\n]", dados.cep);
printf("\n\n\n");

fwrite(dados.nome, 30, 1, p);
fwrite(dados.end, 20, 1, p);
fwrite(dados.cidade, 20, 1, p);
fwrite(dados.estado, 20, 1, p);
fwrite(dados.cep, 20, 1, p);

fclose(p); // Necessario fechar antes de retornar, caso contrario, o windows nao atualizara o conteudo do arquivo (Sim, coisa feia que apenas Windows faz)

system("pause");
}

//////////////////leitura//////////////////////
/**
O carregamento é dinamico, alem disso, é incrementado um contador para montar o vetor
**/
void le_arq(void)
{
if ( ( p = fopen("arq3.txt","r+") ) == NULL )
{
printf("erro na abertura do arquivo \n");
exit(0);
}

i = 0;

printf("Dados do arquivo \n\n\n");

fread(listaDados[i].nome, 30, 1, p);
fread(listaDados[i].end, 20, 1, p);
fread(listaDados[i].cidade, 20, 1, p);
fread(listaDados[i].estado, 20, 1, p);
fread(listaDados[i].cep, 20, 1, p);

while ( ! feof(p) ) // mesmo esquema do outro for, só que para leitura e apresentação
{
printf("[%d] Nome: %s\n", i, listaDados[i].nome);
printf("[%d] End: %s\n", i, listaDados[i].end);
printf("[%d] Cidade: %s\n", i, listaDados[i].cidade);
printf("[%d] Estado: %s\n", i, listaDados[i].estado);
printf("[%d] CEP: %s\n", i, listaDados[i].cep);
printf("\n");

i++; // Incrementa o contador

fread(listaDados[i].nome, 30, 1, p);
fread(listaDados[i].end, 20, 1, p);
fread(listaDados[i].cidade, 20, 1, p);
fread(listaDados[i].estado, 20, 1, p);
fread(listaDados[i].cep, 20, 1, p);
}

fclose(p); // Necessario fechar antes de retornar, caso contrario, o windows nao atualizara o conteudo do arquivo (Sim, coisa feia que apenas Windows faz)

getchar();
}

int main(void)
{
int op = 1;
while ( op != 0 )
{

printf(" Ecolha uma opcao ! \n\n");
printf("1-Gravar arquivos.\n");
printf("2- Ler arquivos. \n");
printf("0- Sair. \n");
printf("\n\n");
scanf("%d", &op);
printf("\n\n");

switch(op)
{
case 1:
{
cad_arq();
a = a+1; // depois que você adcionou um registro já coloca o indice da matriz no próximo
break;
}

case 2:
{
le_arq();
break;
}

case 0:
{
printf("fim de programa, obrigado \n");
break;
}

default:
{
printf("opcao incorreta");
break;
}
}
}

system("pause");

return 0;
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!