Jump to content
kenzi

gravar registos de estrutura em ficheiro

Recommended Posts

kenzi

Boa noite a todos,

Eu tenho um estrutura que define um animal.

typedef struct{

 int nrAnimal;
 char nome[30];
 char origem[30];
 char localC[30];
 char dataA[12];
 char raca[30];
 int idade;
 char nomeP[30];
 char nomeM[30];
 char localR[30];
 char estado[30];
 char adestrador[30];
 } Animal;

De seguida criei um função para inserir um registo de cada vez.

void inserir()
{

printf("\n\nInserir novo animal\n\n");

printf("\nNumero do animal: ");
scanf("%d", &animal.nrAnimal);

printf("\nNome: ");
fflush(stdin);
gets(animal.nome);

printf("\nOrigem: ");
fflush(stdin);
gets(animal.origem);

printf("\nLocal de Cativeiro: ");
fflush(stdin);
gets(animal.localC);

printf("\nData de entrada: ");
fflush(stdin);
gets(animal.dataA);

printf("\nRaca: ");
fflush(stdin);
gets(animal.raca);

printf("\nIdade: ");
scanf("%d",&animal.idade);

printf("\nNome da Pessoa que o recolheu: ");
fflush(stdin);
gets(animal.nomeP);

printf("\nNome do Municipio: ");
fflush(stdin);
gets(animal.nomeM);

printf("\nLocal onde foi recolhido: ");
fflush(stdin);
gets(animal.localR);

printf("\nEstado de Saude: ");
fflush(stdin);
gets(animal.estado);

printf("\nAdestrador: ");
fflush(stdin);
gets(animal.adestrador);


ficheiro = fopen("ficheiro.txt","w+");
if (ficheiro == NULL)
ficheiro = fopen("ficheiro.txt","w+");

fseek(ficheiro, 0, SEEK_END);
fwrite(&animal, sizeof(Animal),1,ficheiro);
printf("\n\nAnimal registado com sucesso!\n\n");

fclose(ficheiro);
}

1º problema - o registo é inserido no ficheiro, mas os campos não ficam seguidos, mas sim com um grande espaço entre eles.

2º problema - Quando faço uma segunda inserção de um novo registo, ele não cria outra linha, mas substitui o primeiro registo.

Já consegui resolver este problema ... mudei a forma de abrir o ficheiro de w para a e ja insere mais que um registo.

Edited by kenzi

Share this post


Link to post
Share on other sites
HappyHippyHippo

fwrite é para interacção com ficheiros binários, e é por isso que está a ser gravada toda a informação da estrutura como se estivesse em memória.

se queres ter ficheiros de texto, terás de usar outros métodos como o fprintf

ps : não uses o fflush(stdin) ou o gets ... usa soluções mais seguras e portáveis


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
brunoais

E cuidado com o scanf().

Lê a documentação sobre como o usar. Da maneira que o estás a usar, pode bem dar problemas em relação aos dados que tens.

Cuidado com stack ou heap overflows. Mesmo que substituas essas funções por umas mais seguras, não é só a sua substituição que vai resolver os problemas de segurança e estabilidade, tens que ler e perceber como usá-las.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
kenzi

fwrite é para interacção com ficheiros binários, e é por isso que está a ser gravada toda a informação da estrutura como se estivesse em memória.

se queres ter ficheiros de texto, terás de usar outros métodos como o fprintf

ps : não uses o fflush(stdin) ou o gets ... usa soluções mais seguras e portáveis

Já coloquei o fpritnf e fica toda a informação direitinha.

quanto ao gets e fflush , o scanf("%[^\n]) ou scanf("%30[^\n]); seria uma boa opção ?

quanto ao fwrite, eu anteriormente estava a trabalhar com ficheiros binários, mas para testar e ver o que realmente ele colocava no ficheiro, decidi ver primeiro em .txt , caso contrário era ilegível :) .

Edited by kenzi

Share this post


Link to post
Share on other sites
HappyHippyHippo

não é ilegível se inicializares correctamente a memória:

Animal animal;
memset(animal, 0, sizeof(Animal));


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
kenzi

Já agora, quero escrever um registo por linha.

Eu faço o fseek para o fim do ficheiro, mas queria que me desse uma quebra de linha.

Share this post


Link to post
Share on other sites
HappyHippyHippo

em ficheiros binários não existe o conceito de quebra de linha

e mesmo em ficheiros de texto, para descobrir a quebra de linha tens de percorrer o stream à procura do que pretendes


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
kenzi

Bem ... estou a optar por gravar em ficheiro binário e usar a função fwrite.

Agora tenho uma função em que quero listar todos os animais do ficheiro.dat

void listar(){


Animal *animal = malloc((sizeof(Animal) * 2));
FILE *ficheiro;
int n;

ficheiro = fopen("ficheiro.dat","r+b");
if (ficheiro == NULL) {
printf("Ficheiro Inexistente! Impossível abrir!!");
system("PAUSE");
getch();
exit(1);
}

fread(animal, sizeof(Animal),2,ficheiro);

printf("\n\n----------------------");
printf("\nAnimais Dispiniveis\n");
printf("----------------------\n");
for(n=0;n<2; n++){

printf("\nNumero: %d\n",animal[n].nrAnimal);
printf("Nome: %s\n",animal[n].nome);
printf("Origem: %s\n",animal[n].origem);
printf("Local de Cativeiro: %s\n",animal[n].localC);
printf("Data: %s\n",animal[n].dataA);
printf("Raca: %s\n",animal[n].raca);
printf("Idade: %d\n",animal[n].idade);
printf("Nome da Pessoa: %s\n",animal[n].nomeP);
printf("Municipio: %s\n",animal[n].nomeM);
printf("Local de Recolha: %s\n",animal[n].localR);
printf("Estado: %s\n",animal[n].estado);
printf("Adestrador: %s\n",animal[n].adestrador);
printf("----------------------\n\n");
}
getch();



}

O que queria mudar era ter uma variável que contava quantos elementos eu tenho para listar.

Nesta versão eu se adicionar um novo animal, tenho sempre que mudar os argumentos do malloc,do fread e do ciclo for para que lista sem problemas.

Neste caso tenho dois animais, mas se adicionar outro e quiser listar tenho que mudar o numero 2 para 3.

Tenho uma opção ... que é ter uma variável global e sempre que adicionar um novo animal, incremento. Futuramente quando eliminar um animal, decremente.Se alguém tiver uma outra maneira mais simples e segura agradecia :)

Edited by kenzi

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.