Save list in file

Asked

Viewed 331 times

3

I have an exercise that I register trucks, cities, loads through a list, but I’m not able to save in a file (it’s the last function) when I select the save option(#7), it closes the program.

What am I missing?

My code:

#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,"Marca:%s\n", noatual->kml);
                noatual = noatual->prox;
            }
        }
    }
    fclose(arquivo);
    printf("Salvo com Sucesso!");
}
  • Someone can help me?

  • 1

    The problem seems to be because in the function "save(lcam **head)", the pointer "lcam *noactual" does not point to anything.

  • How do I fix it?

  • There is an error in "if(file = NULL)" where there is an assignment of NULL to the pointer. I believe you want to compare, in this case use "==".

2 answers

0

Hello. I made adjustments to the 'salvacam' function':

  1. There is an error in "if(file = NULL)" where there is an assignment of NULL to the pointer. I believe you want to match, in this case use "==".

  2. assigned 'head' to pointer '*nocurrent'.

See if this is the favorable outcome for your exercise.

void salvacam(lcam **cabeca){

    lcam *noatual = cabeca;

    FILE *arquivo;
    arquivo = fopen("CaminhC5es.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,"Marca:%s\n", noatual->kml);
                noatual = noatual->prox;
            }
            printf("Salvo com Sucesso!");
        }
        fclose(arquivo);
    }
}

-1

What do you want with this job anyway? What good is that lcam* noatual on the second line? It Serves to scroll through the list **cabeça?

And, of course, I can’t help but notice the small error between attribution and comparison in if(arquivo = NULL). Normally it should be if(arquivo == NULL).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.