C 代码运行但当我从文件中读取时没有任何反应

C code runs but nothing happens when i read from file

我在这里要做的是从 CSV 文件中读取第 3 到 32 行和第 35 到 44 行。 当我阅读这些行时,我使用 strtok 来分隔值并用每个标记填充一个结构。 问题是当我 运行 代码没有任何反应。我能够将错误跟踪到这部分代码,因为当我对这部分代码进行注释时,程序 运行 非常完美。 这是代码:

#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++;
        }
        
    }
}

这是结构头文件:

#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 

我正在尝试读取的文件:

你必须在循环中再次调用strtok

           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, ";"); <<<=====
            }

否则你会永远循环

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