Mattheusadh Postado Setembro 2, 2016 Denunciar Share Postado Setembro 2, 2016 #include<stdio.h> #include<stdlib.h> #include<string.h> #define TAM 2 int cont; struct data{ int dia; int mes; int ano; }; struct contato{ char nome[50]; char fone[15]; struct data niver; }agenda[TAM]; enserir(){ FILE *arq; arq=fopen("agenda.data","ab"); if(arq==NULL){ printf("Erro na abertura do arquivo.\n"); }else{ if(cont<=TAM){ do{ fflush(stdin); printf("\nInsira o nome do contato: "); scanf("%s", &agenda[cont].nome); printf("Insira o telefone do contato: "); scanf("%s", &agenda[cont].fone); printf("Insira a data de aniversario do contato: "); scanf("%d %d %d", &agenda[cont].niver.dia, &agenda[cont].niver.mes, &agenda[cont].niver.ano); fseek(arq, cont*sizeof(struct contato), SEEK_SET); fwrite(agenda,sizeof(struct contato),1,arq); cont++; printf("\nContato salvo com sucesso.\n"); printf("Deseja inserir mais contatos? (s/n) : "); }while(getche() == 's'); }else{ printf("Agenda cheia"); } fclose(arq); } } listar(){ FILE *arq; struct contato aux; arq=fopen("agenda.data","rb"); if(arq==NULL){ printf("Erro na abertura do arquivo.\n"); }else{ while(fread(&aux, sizeof(struct contato),1,arq)==1 && !feof(arq)){ printf("\nNome: %s\n", aux.nome); printf("Telefone: %s\n", aux.fone); printf("Aniversaio: %d/%d/%d\n",aux.niver.dia,aux.niver.mes,aux.niver.ano); fread(&aux, sizeof(struct contato), 1, arq); } } fclose(arq); getch(); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 CyberGate Postado Setembro 3, 2016 Denunciar Share Postado Setembro 3, 2016 fseek(arq, cont*sizeof(struct contato), SEEK_SET); Quando usas "a" ou "ab" para abrir um ficheiro, o ponteiro de escrita vai sempre para o final do arquivo. Funções para reposicionar o ponteiro (como o seek que utilizas-te) são ignoradas. Mas de qualquer dar formas essa parte está bem. while(fread(&aux, sizeof(struct contato),1,arq)==1 && !feof(arq)){ printf("\nNome: %s\n", aux.nome); printf("Telefone: %s\n", aux.fone); printf("Aniversaio: %d/%d/%d\n",aux.niver.dia,aux.niver.mes,aux.niver.ano); fread(&aux, sizeof(struct contato), 1, arq); Mas aqui, quando extrais os dados, utilizas duas vezes o "fread", uma enquanto estás a verificar, e outra no final (não sei porque). Tira essa do final e vais ver que vai funcionar. if(cont<=TAM){ Outro erro que eu vi, que te poderá dar problemas no futuro é essa expressão. cont não pode ser igual a TAM, pois o ultimo elemento do array é TAM - 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Mattheusadh
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TAM 2
int cont;
struct data{
int dia;
int mes;
int ano;
};
struct contato{
char nome[50];
char fone[15];
struct data niver;
}agenda[TAM];
enserir(){
FILE *arq;
arq=fopen("agenda.data","ab");
if(arq==NULL){
printf("Erro na abertura do arquivo.\n");
}else{
if(cont<=TAM){
do{
fflush(stdin);
printf("\nInsira o nome do contato: ");
scanf("%s", &agenda[cont].nome);
printf("Insira o telefone do contato: ");
scanf("%s", &agenda[cont].fone);
printf("Insira a data de aniversario do contato: ");
scanf("%d %d %d", &agenda[cont].niver.dia, &agenda[cont].niver.mes, &agenda[cont].niver.ano);
fseek(arq, cont*sizeof(struct contato), SEEK_SET);
fwrite(agenda,sizeof(struct contato),1,arq);
cont++;
printf("\nContato salvo com sucesso.\n");
printf("Deseja inserir mais contatos? (s/n) : ");
}while(getche() == 's');
}else{
printf("Agenda cheia");
}
fclose(arq);
}
}
listar(){
FILE *arq;
struct contato aux;
arq=fopen("agenda.data","rb");
if(arq==NULL){
printf("Erro na abertura do arquivo.\n");
}else{
while(fread(&aux, sizeof(struct contato),1,arq)==1 && !feof(arq)){
printf("\nNome: %s\n", aux.nome);
printf("Telefone: %s\n", aux.fone);
printf("Aniversaio: %d/%d/%d\n",aux.niver.dia,aux.niver.mes,aux.niver.ano);
fread(&aux, sizeof(struct contato), 1, arq);
}
}
fclose(arq);
getch();
}
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.