Structs not fed

Asked

Viewed 57 times

-1

Dear Programmers(s) in C, good night,

I ask for help for the following case: I want to feed an array of structs to each interaction in a line of a file, the problem is that, although I can read the line of the file, I cannot send the data to the struct.

Follows the code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#define TAM_VEICULOS 100
#define TAM_RESERVAS 100
#define TAM_DEVOLUCOES 100


const int TAM_BUFFER = 660;

//char    TAM_BUFFER[660];
char    url_veiculos[]   = "veiculos.csv";
FILE    *arq_veiculos;
char    url_reservas[]   = "reservas.csv";
FILE    *arq_reservas;
//char  url_devolucoes[] = "devolucoes.csv";

int opc;

void menu();

int     tam_arquivo_veiculos = 0, tam_arquivo_reservas = 0, tam_arquivo_devolucoes = 0, count = 0;

char    linha_veiculos[660];
char    linha_resevas[660];
char    linha_devolucoes[660];

char    marca_disponivel[15];
char    modelo_disponivel[15];
char    placa_disponivel[15];
char    valorDiaria_disponivel[8];

char    marca_nao_disponivel[15];
char    modelo_nao_disponivel[15];
char    placa_nao_disponivel[15];
char    valorDiaria_nao_disponivel[8];

// struct do arquivo veiculos.cvs
typedef struct {
    char    codigo[15];
    char    marca[15];
    char    modelo[15];
    char    placa[15];
    char    valorDiaria[8]; 
} Veiculos;

// array do arquivo de veicuos
Veiculos veiculos[TAM_VEICULOS];

// struct do arquivo reservas.cvs
typedef struct {
    char    reserva_ticket[10];
    char    reserva_cpf[12];
    char    reserva_bonus[2];
    char    reserva_placa[9];
    char    reserva_data_contrato[11];
    char    reserva_hora_contrato[6];
    char    reserva_data_devolucao[11];
    char    reserva_hora_devolucao[6];
    char    reserva_preco_contrato[7];
    char    reserva_preco_devolucao[7];
    char    reserva_desconto_um[7];
    char    reserva_desconto_dois[7];
} Reservas;

Reservas reservas[TAM_RESERVAS];

void preenche_array_veiculos() {
    arq_veiculos = fopen(url_veiculos, "r");
    if(arq_veiculos == NULL) {
        printf("Erro, nao foi possivel abrir o arquivo veiculos\n");
    } else {
        fflush(stdin);
        while (fgets(linha_veiculos, TAM_BUFFER, arq_veiculos)) {
            fscanf(arq_veiculos, "%[^;],%[^;],%[^;],%[^;]\n", veiculos[tam_arquivo_veiculos].codigo, veiculos[tam_arquivo_veiculos].marca, 
            veiculos[tam_arquivo_veiculos].modelo, veiculos[tam_arquivo_veiculos].placa, veiculos[tam_arquivo_veiculos].valorDiaria);

            printf("Linha veículos: %s\n", linha_veiculos);

            ++tam_arquivo_veiculos;

            printf("Tamanho do arquivo veiculos: %d\n", tam_arquivo_veiculos);
        }
    }
}

void preenche_array_reservas () {
    arq_reservas   = fopen(url_reservas, "r");
    if(arq_reservas == NULL) { // etapa 2 - listar as reservas linha a linha
        printf("Erro, nao foi possivel abrir o arquivo reservas\n");
    } else {
        fflush(stdin);
        while (fgets(linha_resevas, TAM_BUFFER, arq_reservas)) {
            fscanf(arq_reservas, "%[^;],%[^;],%[^;],%[^;],[^;],%[^;],%[^;],%[^;],%[^;],%[^;]\n", reservas[tam_arquivo_reservas].reserva_ticket, 
            reservas[tam_arquivo_reservas].reserva_cpf, reservas[tam_arquivo_reservas].reserva_bonus, reservas[tam_arquivo_reservas].reserva_placa, 
            reservas[tam_arquivo_reservas].reserva_data_contrato, reservas[tam_arquivo_reservas].reserva_data_devolucao,
            reservas[tam_arquivo_reservas].reserva_preco_contrato, reservas[tam_arquivo_reservas].reserva_preco_devolucao,
            reservas[tam_arquivo_reservas].reserva_desconto_um, reservas[tam_arquivo_reservas].reserva_desconto_dois);

            ++tam_arquivo_reservas;

            printf("Tamanho do arquivo reservas: %d\n", tam_arquivo_reservas);
        }
    }
}

void fechar_arquivos () {
    //fclose(arq_devolucoes);
    fclose(arq_reservas);
    fclose(arq_veiculos);
}

void lista_veiculos () {
    printf("Tamanho do arquivo Veiculos: %d ", &tam_arquivo_veiculos);

    for (count = 0; count <= tam_arquivo_veiculos; count++) {
        printf("Marca: %s\n", veiculos[count].marca);
        printf("Placa: %s\n", veiculos[count].placa);
    }
}

executa(opc) {
    setlocale(LC_ALL, "Portuguese");
    switch(opc) {
        default:
        preenche_array_veiculos();
        preenche_array_reservas ();
        fechar_arquivos();
        lista_veiculos();
    }
}

Thanks in advance.

2 answers

0

Solved.

The problem was the separation of the fields, where comma was used, the semicolon being correct.

This

"%[^;],%[^;],%[^;],%[^;]\n"

Has been corrected for this:

"%[^;];%[^;];%[^;];%[^;]\n"

Thank you to everyone who tried to help.

-1

People, I almost solved.

Instead of doing this

while (fgets(linha_veiculos, TAM_BUFFER, arq_veiculos)) {
            fscanf(arq_veiculos, ...

did that:

while (fgets(linha_veiculos, TAM_BUFFER, arq_veiculos)) {
            sscanf(linha_veiculos, ...

The problem is that it only assigns value to variable in the first field of the file, the other fields do not assign.

Browser other questions tagged

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