Ad

C Code Runs But Nothing Happens When I Read From File

What I'm trying to do here is to read lines 3 to 32 and 35 to 44 from a CSV file. When I read the lines, I use strtok to separate the values and fill a struct with each token. The thing is when I run the code nothing happens. I was able to trace the error to this part of the code because when I commented this part of the code the program ran perfectly. Here is the code:

#include <stdio.h>
#include <stdlib.h>
#include "carregar_files.h"
#include <string.h>
#include "mylib.h"


void necessidades_de_producao()
{
    FILE *fp = fopen("OP_2022_02_01.csv", "r");
    int i = 1, cont = 0;
    char buff[1000];
    ordens_compra *necessidades;
    ordens *op;
    necessidades = (ordens_compra*)malloc(1 * sizeof(ordens_compra));
    op = (ordens*)malloc(1 * sizeof(ordens));
    
    
    if(!fp)
    {
        printf("Erro ao abrir o ficheiro!!!!!!\n");
    }
    else
    {

        while(fgets(buff, 1000, fp) != NULL)
        {
            char *token;
            int count;

            if(i>=3 && i<=32)//linhas de operacao
            {
                op = (ordens*)realloc(op, sizeof(ordens) * (cont + 1));// atualiza o tamanho da struct para o numero de ordens

                token = strtok(buff,";"); // seprara a string buff em vários tokens

                count = 0;

                while(token != NULL){// percorrer os tokens, e verificar qual a posição do token para preencher corretamente

                    if(count == 0){op[cont].id = atoi(token);}//atoi recebe string e converte em int
                    if(count == 1){strcpy(op[cont].tipo,token);}
                    if(count == 2){op[cont].tamanho = atoi(token);}
                    if(count == 3){op[cont].quantidade = atoi(token);}
                    count ++;
                }

                cont++;
            }
            
            if(i>=35 && i<=44)//linhas de necessidade
            {
                necessidades = (ordens_compra*)realloc(necessidades, sizeof(ordens_compra) * (cont + 1));

                token = strtok(buff,";");
                
                count = 0;
                
                while(token != NULL){
                    
                    if(count == 0){necessidades[cont].OP = atoi(token);}//atoi recebe string e converte em int
                    if(count == 1){necessidades[cont].materia_prima = atoi(token);}
                    if(count == 2){necessidades[cont].quantidade = atoi(token);}
                    count ++;
                }
                cont++;
            }
            
            i++;
        }
        
    }
}

And here is the structs header file:

#ifndef CARREGAR_FILES_H
#define CARREGAR_FILES_H

#ifdef __cplusplus
extern "C" {
#endif

#define SUCESS "\nOs dados foram carregados com sucesso!\n"

typedef struct 
{
    int code;
    char produto[10];
    int min_stock;
    int atual_stock;
} MP_couro;

typedef struct 
{
    int code;
    char produto[10];
    int min_stock;
    int atual_stock;
} MP_tecido;

typedef struct 
{
    int code;
    char produto[10];
    int min_stock;
    int atual_stock;
} MP_borracha;

typedef struct 
{
    int code;
    char produto[10];
    int min_stock;
    int atual_stock;
} MP_cordoes;

typedef struct 
{
    int code;
    char produto[10];
    int min_stock;
    int atual_stock;
} MP_palmilhas;

//------------------------------------------------------//

typedef struct 
{
    MP_couro *couro;
    MP_tecido *tecido;
    MP_borracha *borracha;
    MP_cordoes *cordoes;
    MP_palmilhas *palmilhas;
} tabela_stock;//estrutura para interligar as estruturas das matérias-Primas


typedef struct key_value 
{
    char col0[50];//coluna 1 da tabela de stocks
    char col1[50];//coluna 2 da tabela de stocks
    char col2[50];//coluna 3 da tabela de stocks
    char col3[50];//coluna 4 da tabela de stocks
} row_structure;

typedef struct 
{
    int id;
    char tipo[50];
    int tamanho;
    int quantidade;
} ordens;//estrutura para as ordens de produção

typedef struct 
{
    int OP;
    int materia_prima;
    int quantidade;
}ordens_compra;//estrutura para as necessidades de compra

void carregar_stocks(MP_couro *c,MP_tecido *t,MP_borracha *b, MP_cordoes *cs, MP_palmilhas *p);
void editar_stock_min(MP_couro *c,MP_tecido *t,MP_borracha *b, MP_cordoes *cs, MP_palmilhas *p);
void necessidades_de_producao();//!!!!
void free_memoria (tabela_stock *stock);

#ifdef __cplusplus
}
#endif

#endif 

File that I'm trying to read from:

File that I'm trying to read from

Ad

Answer

you have to call strtok again in the loop

           while(token != NULL){// percorrer os tokens, e verificar qual a posição do token para preencher corretamente

                if(count == 0){op[cont].id = atoi(token);}//atoi recebe string e converte em int
                if(count == 1){strcpy(op[cont].tipo,token);}
                if(count == 2){op[cont].tamanho = atoi(token);}
                if(count == 3){op[cont].quantidade = atoi(token);}
                count ++;
                token = strtok(NULL, ";"); <<<=====
            }

otherwise you loop forever

see https://www.geeksforgeeks.org/strtok-strtok_r-functions-c-examples/

Ad
source: stackoverflow.com
Ad