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á
Editado por Jonathan Queiroz Remover caixa alta do título conforme regra 3.7 (Jonathan)
Pergunta
sergio190986
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:
grato desde já
Editado por Jonathan QueirozRemover caixa alta do título conforme regra 3.7 (Jonathan)
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.