Ir ao conteúdo
  • Cadastre-se

Alocação dinamica para Aquivos.txt em C??


psydhelic

Posts recomendados

fiz uma alocação dinamica para uma struct salvos em txt... so que o codigo so funciona em tempo e execução eu faço varios cadastros e so consigo pesquisar em tempo de execução e eu queria que gravasse para consultar quando quiser....


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

//Cada contato possui um nome e telefone.
struct Contato{
char nome[100];
int telefone;
};

int main(){
//Ponteiro para estrutura. Vai ser o nosso vetor de
//estruturas dinamicas com os dados da agenda.
struct Contato *agenda;
int cap; //Capacidade do vetor (tamanho real do vetor).
int n; //Numero de contatos cadastrados (tamanho usado).
int opc; //Opcao do menu selecionada.
int i;
FILE *fp;

//Abrindo arquivo em modo de leitura ("r" = read).
fp = fopen("agenda.txt","r");

//Se retorna NULL é porque nao encontrou o arquivo.
//Isso acontece na primeira vez que rodamos o programa.
if(fp==NULL){
n = 0; //Base de dados inicialmente vazia.
cap = 20; //Fixamos uma capacidade inicial (ex: 20).

//Alocammos o vetor de estruturas de forma
//dinamica conforme a capacidade.
agenda = (struct Contato *)malloc(sizeof(struct Contato)*cap);
}
else{ //Arquivo encontrado, logo procedemos com a leitura.

//Le o numero de registros.
fread(&n, sizeof(int), 1, fp);

//A capacidade deve ser maior ou igual a "n" (ex: n*2).
cap = n*2;

//Alocammos o vetor de estruturas de forma
//dinamica conforme a capacidade.
agenda = (struct Contato *)malloc(sizeof(struct Contato)*cap);

//Leitura dos dados dos registros do arquivo para o vetor.
fread(agenda, sizeof(struct Contato), n, fp);

//Fecha arquivo apos leitura.
fclose(fp);
}

do{
//Exibe o menu de opções.
printf("*** Menu ***\n");
printf("1) Cadastrar contato.\n");
printf("2) Exibir contatos.\n");
printf("3) Apagar.\n");
printf("4) Sair.\n");
//Le a opcao selecionada.
scanf("%d",&opc);

if(opc==1){
//Inserir novo contato no final do vetor.

if(n==cap){
//Capacidade esgotada, devemos aumentar o
//vetor usando "realloc" (ex: dobrar capacidade).
cap *= 2;
agenda = realloc(agenda, sizeof(struct Contato)*cap);
}
//Leitura dos dados.
printf("Digite o nome: ");
scanf(" %[^\n]",agenda[n].nome);
printf("Digite o telefone: ");
scanf("%d",&agenda[n].telefone);
n++; //Incrementa numero de registros cadastrados.
}
else if(opc==2){
//Exibe todos contatos cadastrados.
for(i=0; i<n; i++){
printf("*** Contato %d ***\n",i+1);
printf("Nome: %s\n",agenda[i].nome);
printf("Telefone: %d\n",agenda[i].telefone);
}
}
else if(opc==3){
//Apaga um contato
char nome[100];
int j;
scanf("%s",&nome);
for(i=0; i<n; i++){
if (strcmp(agenda[i].nome, nome)==0){
for(j=i+1; j<n; j++){
strcpy(agenda[j-1].nome,agenda[j].nome);
agenda[j-1].telefone=agenda[j].telefone;
}
n--;
i=n;
}
}
}
//Enquanto nao for opcao de saida continua mostrando menu.
}while(opc!=4);

if(n>0){
//Se existe algum contato cadastrado
//então grava para o disco.

//Abre arquivo em modo de gravacao ("w" = write).
fp = fopen("agenda.txt","w");

//Grava o numero de contatos no inicio do arquivo.
fwrite(&n, sizeof(int), 1, fp);

//Grava os dados do vetor no arquivo.
fwrite(agenda, sizeof(struct Contato), n, fp);


//Fecha arquivo apos a gravacao.
fclose(fp);
}

//Libera a memoria alocada do vetor.
free(agenda);

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...