Olá a todos, estou tentando fazer uma agenda em linguagem C que tenha um menu na função main e funções para cada opção. Quero que a função para listar os contatos leia um arquivo binário, onde eles estão inseridos.
O problema ocorre quando tento utilizar a função para listar os contatos, já que ela mostra algo mais parecido com endereços de variáveis. Se puderem ajudar, serei muito grato.
Meu código main:
#include <stdio.h>
#include <string.h>
#define ARQUIVO "agenda.bin"
void addContato();
int listarContatos(int tipo_listagem);
void inativar(char inativando[]);
struct agenda
{
char nome[60], endereco[300], email[50];
int numero, telefone, ativo;
};
int main(void)
{
FILE *arq;
int opcao = 0, sair = 0;
struct agenda contato;
int opcao_listar = 0; // Variável da função listarContatos();
int contatos_listados = 0;
char inativar_contato[60];
do
{
printf("1- Adicionar\n2- Listar contatos\n3- Inativar contato\n\n");
printf("Digite sua opcao: ");
scanf("%d", &opcao);
switch (opcao)
{
case 1:
addContato();
break;
case 2:
do
{
printf("\t1- Listar todos os contatos\n\t2- Listar contatos ativos\n\t3- Listar contatos inativos\n");
scanf("%d", &opcao_listar);
contatos_listados = listarContatos(opcao_listar);
printf("\nContatos Listados: %d\n", contatos_listados);
} while ((opcao_listar < 1) || (opcao_listar > 3));
break;
case 3:
printf("Contato: ");
fflush(stdin);
gets(inativar_contato);
inativar(inativar_contato);
break;
}
fclose(arq);
int sair = -1;
printf("Deseja sair [0- Sim | 1- Nao]: ");
scanf("%d", &sair);
} while (sair);
return 0;
}
void addContato()
{
struct agenda contato;
FILE *arq;
if ((arq = fopen(ARQUIVO, "a+b")) == NULL)
{
printf("ERRO DE LEITURA DO ARQUIVO!\n");
}
else
{
rewind(arq);
fseek(arq, sizeof(struct agenda), SEEK_SET);
if (fwrite(&contato, sizeof(struct agenda), 1, arq) != 1)
{
printf("\nERRO DE GRAVACAO!\n");
}
else
{
printf("Nome: ");
fflush(stdin);
gets(contato.nome);
printf("Endereco: ");
fflush(stdin);
gets(contato.endereco);
printf("E-mail: ");
fflush(stdin);
gets(contato.email);
printf("Numero: ");
scanf("%d", &contato.numero);
printf("Telefone: ");
scanf("%d", &contato.telefone);
do
{
printf("Ativo [1- Sim | 2- Nao]: ");
scanf("%d", &contato.ativo);
} while ((contato.ativo <= 0) || (contato.ativo >= 3));
}
}
fclose(arq);
}
int listarContatos(int tipo_listagem)
{
int i;
struct agenda contato;
FILE *arq;
if (!(arq = fopen(ARQUIVO, "rb")))
{
printf("ERRO DE LEITURA DO ARQUIVO!\n");
}
else
{
while (!feof(arq))
{
if (fread(&contato, sizeof(struct agenda), 1, arq) == 1)
{
if (tipo_listagem == 1)
{
printf("Nome: %s\n", contato.nome);
printf("Endereco: %s\n", contato.endereco);
printf("E-mail: %s\n", contato.email);
printf("Numero: %d\n", contato.numero);
printf("Telefone: %d\n", contato.telefone);
printf("Contato ativo [1- Sim | 2- Nao]: %d\n", contato.ativo);
}
else if (tipo_listagem == 2)
{
if (contato.ativo == 1)
{
printf("Nome: %s\n", contato.nome);
printf("Endereco: %s\n", contato.endereco);
printf("E-mail: %s\n", contato.email);
printf("Numero: %d\n", contato.numero);
printf("Telefone: %d\n", contato.telefone);
printf("Contato ativo [1- Sim | 2- Nao]: %d\n", contato.ativo);
}
}
else
{
if (contato.ativo == 2)
{
printf("Nome: %s\n", contato.nome);
printf("Endereco: %s\n", contato.endereco);
printf("E-mail: %s\n", contato.email);
printf("Numero: %d\n", contato.numero);
printf("Telefone: %d\n", contato.telefone);
printf("Contato ativo [1- Sim | 2- Nao]: %d\n", contato.ativo);
}
}
}
}
fclose(arq);
return i++;
}
}
void inativar(char inativando[])
{
FILE *arq;
char alvo[60];
struct agenda contato;
int encontrado = 0;
rewind(arq);
while((!feof(arq)) && (encontrado == 0)){
if(fread(&contato, sizeof(struct agenda), 1, arq) == 1){
if(!(strcmp(contato.nome, inativando))){
encontrado = 1;
contato.ativo = 2;
fseek(arq, -sizeof(struct agenda), SEEK_CUR);
if(fwrite(&contato, sizeof(struct agenda), 1, arq) != 1){
printf("ERRO DE GRAVACAO!\n");
}
}
}
}
if(encontrado == 0){
printf("\nNome nao esta cadastrado!\n");
}
fclose(arq);
}