First of all sorry for any english error. So, I have this data in a .txt file
Codigo,Produto,StockMinimo,StockAtual
1,Couro,300,1000
2,Tecido,250,2000
...
I want to skip the first line and read only the integers to a struct
I'm using the bellow function to count the line of the file:
int nrLinhasFicheiro(char *filename){
char ch;
FILE *file;
file = fopen(filename, "r");
int linhas = 0;
if (file != NULL) {
for (ch = getc(file); ch != EOF; ch = getc(file))
if (ch == '\n')
linhas = linhas + 1;
}
fclose(file);
return linhas - 1;
}
and this one to read the file to the struct "Stock" :
void carregarStock(Stock *stock, char *nomeFicheiro){
int i = 0;
int codigo; //stores "codigo" values
char stringFake[40], *storeProduto; //variables to store first line and "Produto" string
int minimo, quantidade;
FILE *fp = fopen(nomeFicheiro, "r");
int numeroLinhas = nrLinhasFicheiro(nomeFicheiro);
if (fp != NULL){
if(numeroLinhas >0){
fscanf(fp, "%s",stringFake);//skip first line
while(i< numeroLinhas){
fscanf(fp, "%d,%s ,%d,%d", &codigo, storeProduto, &minimo, &quantidade);
//fscanf(fp, "%d,%s %d,%d", &codigo, storeProduto, &minimo, &quantidade); also tried this and don't work
if(codigo==1){
stock->minStockCouro = minimo;
stock->couroStock = quantidade;
}else if(codigo==2){
stock->minStockTecido = minimo;
stock->tecidoStock = quantidade;
}else if(codigo==3){
stock->minStockBorracha = minimo;
stock->borrachaStock = quantidade;
}else if(codigo==4){
stock->minStockCordoes = minimo;
stock->cordoesStock = quantidade;
}else if(codigo==5){
stock->minStockPalmilhas = minimo;
stock->palmilhasStock = quantidade;
}
i++;
}
}else{
puts("Error");
}
}else{
puts(MSG_ERRO_LER_FICHEIRO);
}
fclose(fp);
}
Function to print the struct:
void mostrarStock(Stock stock){
puts("============== Stock : =============\n");
puts("Codigo | Produto | Stock Minimo | Stock Atual\n");
printf("1\tCouro\t\t%d\t\t%d\n", stock.minStockCouro, stock.couroStock);
printf("2\tTecido\t\t%d\t\t%d\n", stock.minStockTecido, stock.tecidoStock);
printf("3\tBorracha\t%d\t\t%d\n", stock.minStockBorracha, stock.borrachaStock);
printf("4\tCordões\t\t%d\t\t%d\n", stock.minStockCordoes, stock.cordoesStock);
printf("5\tPalmilhas\t%d\t\t%d\n", stock.minStockPalmilhas, stock.palmilhasStock);
}
This is how i call the function in main:
int main(int argc, char** argv) {
char *nomeFicheiro1 = "tabela_stocks.txt";
Stock stock;
carregarStock(&stock, nomeFicheiro1);
mostrarStock(stock);
return (EXIT_SUCCESS);
}
The function to print the struct doesn't print. I guess the error is in
fscanf(fp, "%d,%s ,%d,%d", &codigo, storeProduto, &minimo, &quantidade);
What am I doing wrong?
You could create a helper function to read out the two integers from one line.
You then just need to call that 5 times.
Example:
If
tabela_stocks.txtcontainsThen the output will be
Since there are so many similarities between the different stocks in your
Stockstruct, you could break it down into smaller pieces and make astructonly holding information about one stock:With that you could create a
Stockstype like this:and reading and printing would become simpler:
Looking closer at the
Stocksstructyou may want to consider using an array instead:which would also simplify the rest of the code since you could loop over that array to read and print each
Stock.