• 0
Sign in to follow this  
joaogabriel97

Salvar lista em arquivo

Question

Boa Noite,estou com um programa que utiliza lista que faz o cadastro de caminhoes,cidades e cargas.Estou tendo problema em salvar a lista em um arquivo.Quando eu seleciono a opção de salvar o programa fecha.

OBS:A função de salvar é a ultima.

 

Segue o código:

 

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

typedef struct caminhoes{
	int id;
	char motorista[200];
	char marca[200];
	char la[200];
	char lisd[200];
	float kml;
	struct caminhoes *prox;
}lcam;

typedef struct cargas{
	int id;
	char produto[200];
	char origem[200];
	char destino[200];
	float vfrete;
	struct cargas *prox;
}lcar;

 typedef struct cidades{
	int id;
	char nome[200];
	char vizinhos[200];
	char distancia[200];
	float vc;
	struct cidades *prox;
}lcid;


void cad_cam(lcam **cabeca);
void cad_car(lcar **carcabeca);
void cad_cid(lcid **cidcabeca);
void imp_cam(lcam *cabeca);
void imp_car(lcar *carcabeca);
void imp_cid(lcid *cidcabeca);
void salvacam(lcam **cabeca);

int main()
{
	setlocale(LC_ALL, "Portuguese");
	
    lcam *cabeca = NULL;        
    lcam *noatual;    
	
	lcar *carcabeca = NULL;
	lcar *carnoatual; 
	
	lcid *cidcabeca = NULL;
	lcid *cidnoatual;
    
    int op;
	
	printf("0 - Fechar \n");
    printf("1 - Cadastrar Caminhão \n");
    printf("2 - Cadastrar Carga \n");
    printf("3 - Cadastrar Cidade \n");
    printf("4 - Imprimir Caminhão\n" );
    printf("5 - Imprimir Cargas\n");
    printf("6 - Imprimir Cidades\n");
    printf("7 - Salvar Caminhao em Arquivo \n");
    printf("8 - Excluir Cargas \n");
    printf("9 - Excluir Cidades \n");
    printf("10 - Relatórios \n");

    printf("Digite uma opcao: \n");
    scanf("%d", &op);
    
    while(op!=0){
 	switch(op){
 		    case 0:{
 		    	op=0;
				break;
			 }
			 break;
            case 1: cad_cam(&cabeca);
                    break;
            case 2: cad_car(&carcabeca);
                    break;
            case 3: cad_cid(&cidcabeca);
			        break;	
			case 4: imp_cam(cabeca);
			        break;
			case 5: imp_car(carcabeca);		
			        break;
		    case 6:imp_cid(cidcabeca);
		           break;
		    case 7:salvacam(&cabeca);
		           break;
            case 8:
		           break;
			case 9:
		           break;
			case 10:
		           break;         
        }
    printf("0 - Fechar \n");
    printf("1 - Cadastrar Caminhão \n");
    printf("2 - Cadastrar Carga \n");
    printf("3 - Cadastrar Cidade \n");
    printf("4 - Imprimir Caminhão\n" );
    printf("5 - Imprimir Cargas\n");
    printf("6 - Imprimir Cidades\n");
    printf("7 - Salvar Caminhao em Arquivo \n");
    printf("8 - Excluir Cargas \n");
    printf("9 - Excluir Cidades \n");
    printf("10 - Relatórios \n");
    
    printf("Digite uma opcao: \n");
    scanf("%d", &op);
    } 
}


void cad_cam (lcam **cabeca)
{
	setlocale(LC_ALL, "Portuguese");
	
    lcam *noatual, *novono;
    
    int id;
    char mot[200];
    char mar[200];
    char loca[200];
    char lisd[200];
    float kml;
    
    printf("ID:\n");
    scanf("%d", &id);
    setbuf(stdin, NULL);
    printf("Motorista:\n");
    scanf("%[^\n]s", &mot);
    setbuf(stdin, NULL);
    printf("Marca:\n");
    scanf("%[^\n]s", &mar);
    setbuf(stdin, NULL);
    printf("Local Atual:\n");
    scanf("%[^\n]s", &loca);
    setbuf(stdin, NULL);
    printf("Lista de Destinos:\n");
    scanf("%[^\n]s", &lisd);
    setbuf(stdin, NULL);
    printf("KM/L:\n");
    scanf("%f", &kml);
    setbuf(stdin, NULL);
    if (*cabeca == NULL)   
    {
        *cabeca = malloc(sizeof(lcam));
        (*cabeca)->id = id;
        strcpy((*cabeca)->motorista, mot);
        strcpy((*cabeca)->marca, mar);
        strcpy((*cabeca)->la, loca);
        strcpy((*cabeca)->lisd, lisd);
        (*cabeca)->kml = kml;
        (*cabeca)->prox = NULL;
    }
        else{
        noatual = *cabeca;
        while(noatual->prox != NULL)
            noatual = noatual->prox;    
        novono =  malloc(sizeof(lcam));
        novono->id = id;
        strcpy(novono->motorista, mot);
        strcpy(novono->marca,mar);
        strcpy(novono->la,loca);
        strcpy(novono->lisd,lisd);
        novono->kml = kml;
        novono->prox = NULL;
        noatual->prox = novono;
    }
}

void cad_car (lcar **carcabeca)
{
	setlocale(LC_ALL, "Portuguese");
	
    lcar *carnoatual, *carnovono;
    
    int id;
    char prod[200];
    char ori[200];
    char dest[200];
    float vf;
    
    printf("ID:\n");
    scanf("%d", &id);
    setbuf(stdin, NULL);
    printf("Produto:\n");
    scanf("%[^\n]s", &prod);
    setbuf(stdin, NULL);
    printf("Origem:\n");
    scanf("%[^\n]s", &ori);
    setbuf(stdin, NULL);
    printf("Destino:\n");
    scanf("%[^\n]s", &dest);
    setbuf(stdin, NULL);
    printf("Valor do Frete:\nR$");
    scanf("%f", &vf);
    setbuf(stdin, NULL);
    if (*carcabeca == NULL)   
    {
        *carcabeca = malloc(sizeof(lcar));
        (*carcabeca)->id = id;
        strcpy((*carcabeca)->produto, prod);
        strcpy((*carcabeca)->origem, ori);
        strcpy((*carcabeca)->destino, dest);
        (*carcabeca)->vfrete = vf;
        (*carcabeca)->prox = NULL;
    }
        else{
        carnoatual = *carcabeca;
        while(carnoatual->prox != NULL)
            carnoatual = carnoatual->prox;    
        carnovono =  malloc(sizeof(lcar));
        carnovono->id = id;
        strcpy(carnovono->produto, prod);
        strcpy(carnovono->origem,ori);
        strcpy(carnovono->destino,dest);
        carnovono->vfrete = vf;
        carnovono->prox = NULL;
        carnoatual->prox = carnovono;
    }
}

void cad_cid (lcid **cidcabeca)
{
	setlocale(LC_ALL, "Portuguese");
	
    lcid *cidnoatual, *cidnovono;
    
    int id;
    char nome[200];
    char viz[200];
    char dist[200];
    float vac;
    
    printf("ID:\n");
    scanf("%d", &id);
    setbuf(stdin, NULL);
    printf("Nome da Cidade:\n");
    scanf("%[^\n]s", &nome);
    setbuf(stdin, NULL);
    printf("Digite o Valor do Combistível:\nR$");
    scanf("%f", &vac);
    setbuf(stdin, NULL);
    
    
    if (*cidcabeca == NULL)   
    {
        *cidcabeca = malloc(sizeof(lcid));
        (*cidcabeca)->id = id;
        strcpy((*cidcabeca)->nome, nome);
        (*cidcabeca)->vc = vac;
        (*cidcabeca)->prox = NULL;
    }
        else{
        cidnoatual = *cidcabeca;
        while(cidnoatual->prox != NULL)
            cidnoatual = cidnoatual->prox;    
        cidnovono =  malloc(sizeof(lcid));
        cidnovono->id = id;
        strcpy(cidnovono->nome, nome);
        cidnovono->vc = vac;
        cidnovono->prox = NULL;
        cidnoatual->prox = cidnovono;
    }
}



void imp_cam(lcam *noatual)
{
	setlocale(LC_ALL, "Portuguese");
	
    while( noatual != NULL)    
    {
        printf("\nID:%d\n", noatual->id);
        printf("Motorista:%s\n", noatual->motorista);
        printf("Marca:%s\n", noatual->marca);
        printf("Local Atual:%s\n", noatual->la);
        printf("Lista de Destinos:%s\n", noatual->lisd);
		printf("KM/L:%.2f\n", noatual->kml);
        noatual = noatual->prox; 
	}
}

void imp_car(lcar *carnoatual)
{
	setlocale(LC_ALL, "Portuguese");
	
    while( carnoatual != NULL)    
    {
        printf("\nID:%d\n", carnoatual->id);
        printf("Produto:%s\n", carnoatual->produto);
        printf("Origem:%s\n", carnoatual->origem);
        printf("Destino:%s\n", carnoatual->destino);
		printf("Valor do Frete:R$%.2f\n", carnoatual->vfrete);
        carnoatual = carnoatual->prox; 
	}
}

void imp_cid(lcid *cidnoatual)
{
	setlocale(LC_ALL, "Portuguese");
	
    while( cidnoatual != NULL)    
    {
        printf("\nID:%d\n", cidnoatual->id);
        printf("Nome da Cidade:%s\n", cidnoatual->nome);
		printf("Valor do Combustível:%.2f\n", cidnoatual->vc);
        cidnoatual = cidnoatual->prox; 
	}
}

void salvacam(lcam **cabeca){
	
	lcam *noatual;
	
	FILE *arquivo;
	arquivo = fopen("Caminhões.txt", "w");
	if(arquivo == NULL){
		printf("Erro na Abertura do Arquivo");
	}
	else{
		if(noatual == NULL){
			fprintf(arquivo,"Lista Vazia!\n");
		}
		else{
			while(noatual != NULL){
				fprintf(arquivo,"ID:%d\n", noatual->id);
				fprintf(arquivo,"Motorista:%s\n", noatual->motorista);
				fprintf(arquivo,"Marca:%s\n", noatual->marca);
				fprintf(arquivo,"Local Atual:%s\n", noatual->la);
				fprintf(arquivo,"Lista de Destinos:%s\n", noatual->lisd);
				fprintf(arquivo,"KM/L:%f\n", noatual->kml);
				noatual = noatual->prox;
			}
		}
	}
	fclose(arquivo);
	printf("Salvo com Sucesso!");
}

 

 

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Ola @joaogabriel97, primeiro creio q o seu problema seja só que o noAtual nao esta na heap, e nem se quer foi iniciado, e vc perguntar se um ponteiro iniciado pelo sistema é NULL pode gerar erros bem complicados. 

void salvacam(lcam **cabeca){
	
	lcam *noatual;
	
	noatual = *cabeca;
	
	FILE *arquivo;
	arquivo = fopen("Caminhões.txt", "a+");
	if(arquivo == NULL){
		printf("Erro na Abertura do Arquivo");
	}
	else{
		if(noatual == NULL){
			fprintf(arquivo,"Lista Vazia!\n");
		}
		else{
			while(noatual != NULL){
				fprintf(arquivo,"ID:%d\n", noatual->id);
				fprintf(arquivo,"Motorista:%s\n", noatual->motorista);
				fprintf(arquivo,"Marca:%s\n", noatual->marca);
				fprintf(arquivo,"Local Atual:%s\n", noatual->la);
				fprintf(arquivo,"Lista de Destinos:%s\n", noatual->lisd);
				fprintf(arquivo,"KM/L:%f\n", noatual->kml);
				noatual = noatual->prox;
			}
		}
	}
	// fclose(arquivo);
	printf("Salvo com Sucesso!");
}

 

Espero que isso resolva seu problema, porem mto cuidado com oq esta fazendo, apesar de o caminho certo ser esse, vc esta complicando mto uma coisa q por natureza já não é tao simples. Mas o caminho é esse aew ;P pelo menos eu acho q é hehe

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this