Jump to content
bcouto

Carregamento de um Ficheiro de Texto para uma Lista Ligada

Recommended Posts

bcouto

Boas Caríssimos.

Estou a meio de um projecto em C para controlo de empréstimos de uma biblioteca e acontece que quando saio do programa, este grava tudo correctamente da lista ligada e a coloca no fichero.txt. Acontece que quando volto a compilar o programa só os ficheiros introduzidos de novo é que ficam correctamente introduzidos na lista ligada, ficando os demais todos baralhados e não entram na lista ligada :s

Precisava imenso da vossa ajuda para conclusão deste projecto, é mesmo urgente e penso que deve ser uma coisa minima que me está a impedir de formular este h.file.

Deixo em baixo aqui o código que me dá problemas na expectativa que me possam ajudar :)

Preciso mesmo da Vossa ajuda. Obrigado.

#include <stdio.h>
   #include<stdlib.h>
   #include<string.h>
   #include <windows.h>
   #include <conio.h>
   #include <tchar.h>
   #include <locale.h>
   #include<time.h>


typedef struct date{
		 int dia, mes, ano;}
data;

typedef struct emprestimo{
		 char nome[51];
		 char isbn[18];
		 data datareq;
		 data dataent;
		 int prazo;
		 }
ficha_emprestimo;

typedef struct _no_emprestimo{
		 ficha_emprestimo emp;
		 struct _no_emprestimo *next;
   }no_emprestimo;

no_emprestimo *AdicionaEmprestimo(no_emprestimo *plistaemp)
   {


		 no_emprestimo *aux;

		 ficha_emprestimo e;
		 int temp;
		 _int64 rawtime;
		 struct tm *r,*d;
		 int classe;
		 if(!(aux=(no_emprestimo *)malloc(sizeof(no_emprestimo)))){
				printf("Erro na reserva de memória");
				exit(1);
		 }

		 puts("\n***** Insira os dados de emprestimo *****\n");

				time (&rawtime);
				r= localtime ( &rawtime );
				printf("Introduza a categoria:");
				scanf("%d",&classe);
				if(classe==0||classe==2)
					   e.prazo=30;
				if(classe==1||classe==7||classe==8||classe==9)
					   e.prazo=15;
				if(classe==3||classe==5||classe==6)
					   e.prazo=7;

				printf("Nome do Requisitante:");
				fflush(stdin);
				gets(e.nome);
				puts("ISBN:***-*-**-******-* : ");
				fflush(stdin);
				gets(e.isbn);

				printf("Data de Requisição:");
				e.datareq.dia=r->tm_mday;
				e.datareq.mes=r->tm_mon+1;
				e.datareq.ano=r->tm_year+1900;
				printf("%d-%d-%d\n",e.datareq.dia,e.datareq.mes,e.datareq.ano);
				rawtime+=3600*24*e.prazo;
				d= localtime (&rawtime);
				printf("Data de Entrega:");
				e.dataent.dia=d->tm_mday;
				e.dataent.mes=d->tm_mon+1;
				e.dataent.ano=d->tm_year+1900;
				printf("%d-%d-%d\n",e.dataent.dia,e.dataent.mes,e.dataent.ano);
				printf("Prazo:%d",e.prazo);	  


		 aux->emp=e;
		 aux->next=plistaemp;





   return aux;
   }

void MostraEmprestimo (no_emprestimo *plistaemp)
   {	
		 printf("\nNome: %s",plistaemp->emp.nome);
		 printf("\nIsbn:%s",plistaemp->emp.isbn);
		 printf("\nData de Requisição: %d-%d-%d",plistaemp->emp.datareq.dia,plistaemp->emp.datareq.mes,plistaemp->emp.datareq.ano);
		 printf("\nData de Entrega: %d-%d-%d",plistaemp->emp.dataent.dia,plistaemp->emp.dataent.mes,plistaemp->emp.dataent.ano);
		 printf("\nPrazo:%d",plistaemp->emp.prazo);
   }

void ApresentaEmprestimo(no_emprestimo *plistaemp)
   {

		 if(plistaemp)
					   while(plistaemp)
					   {
							  MostraEmprestimo(plistaemp);
							  plistaemp=plistaemp->next;
					   }
				else
					   printf("\n**** LISTA VAZIA ****\n");
				system("pause");
				}

void Guarda_Emprestimo(no_emprestimo *plistaemp)
{
   FILE *fp;

   if((fp=fopen("emprest.txt","w"))==NULL){printf("Erro na abertura do Ficheiro.\n");exit(1);}

   if(plistaemp)
   {
		 while(plistaemp)
		 {
				fprintf(fp,"\n%s\t",plistaemp->emp.nome);

				fprintf(fp,"%s\t",plistaemp->emp.isbn);

				fprintf(fp,"%d/%d/%d\t",plistaemp->emp.datareq.dia,plistaemp->emp.datareq.mes,plistaemp->emp.datareq.ano);

				fprintf(fp,"%d/%d/%d\t",plistaemp->emp.dataent.dia, plistaemp->emp.dataent.mes, plistaemp->emp.dataent.ano);

				fprintf(fp,"%d\n",plistaemp->emp.prazo);

				plistaemp=plistaemp->next;
		 }
   }
   fclose(fp);
}

no_emprestimo *Carrega_Emprestimos(no_emprestimo *plistaemp)
{
   FILE *fp;
   ficha_emprestimo e;
   no_emprestimo *aux=plistaemp;
if(!(fp=fopen("emprest.txt", "r")))

		{
			  printf("Erro %d na abertura do ficheiro - Emprest.txt-");
						 exit(1);
				}

  else
  {

		 while(!feof(fp))
				{
				if(!(aux=(no_emprestimo *)malloc(sizeof(no_emprestimo)))){printf("Erro na reserva de memoria");exit(1);}
				fgets(e.nome,49,fp);
				fgets(e.isbn,17,fp);
				fscanf(fp,"\t%d-%d-%d\t",&e.datareq.dia,&e.datareq.mes,&e.datareq.ano);
				fscanf(fp,"\t%d-%d-%d\t",&e.dataent.dia,&e.dataent.mes,&e.dataent.ano);
				fscanf(fp,"\t%d\t",&e.prazo);
				aux->emp=e;
				aux->next=plistaemp;
				plistaemp=aux;

				}
		 }
fclose(fp);
return plistaemp;
}


void menu()
{
   char k=0;
   no_emprestimo *inicio=NULL;

   inicio=Carrega_Emprestimos(inicio);
   while( k != '0')
   {
   system("cls");
   puts("******* Biblioteca *******");
   puts("1- Adicionar Empréstimo");
   puts("2- Mostrar Empréstimos");
   puts("0- Sair");
   k=getch();
   switch (k)
   {
   case '1':inicio=AdicionaEmprestimo(inicio);
				getch();
				break;
   case '2':ApresentaEmprestimo(inicio);
				break;
   case'0':Guarda_Emprestimo(inicio);
				break;
   default:puts("Opção Invalida");
				break;
   }
   }
   getch();
}

int main()
{
   menu();

}

Edited by softklin
Editado titulo, e adicionado GeSHi (código colorido)

Share this post


Link to post
Share on other sites
pikax

Ninguem ainda nao te respondeu, porque o topico foi posto numa seccao errada(ja foi movido), nao das nenhum exemplo de teste, postaste o codigo todo em vez de a parte que esta' te a dar erro, tens uma ma' identacao, o problema que tens esta' pouco explicito, etc...

visto assim por alto, o problema de so te aparecer as datas guardadas na ultima execucao do problema esta' porque apagas o ficheiro todo com o modo "w" - http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

Precisava imenso da vossa ajuda para conclusão deste projecto, é mesmo urgente e penso que deve ser uma coisa minima que me está a impedir de formular este h.file.

nao e' por ser urgente que irao te responder mais rapido... nao percebi a parte que esta a "bold".


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

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