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/
我在这里要做的是从 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/