2017-09-25 3 views
0

J'ai une structure de données à ajouter dans une liste chaînée. La structure de données proviendrait d'un fichier avec une entrée comme celui-ci par exemple:Division d'une chaîne à partir d'un fichier, puis stockage dans une structure

I0001|Item 1|Item 1 Desc|3.50|50 
I0002|Item 2|Item 2 Desc|3.00|20 
I0003|Item 3|Item 3 Desc|4.00|10 

La structure:

typedef struct stock 
{ 
    char id[ID_LEN + NULL_SPACE]; 
    char name[NAME_LEN + NULL_SPACE]; 
    char desc[DESC_LEN + NULL_SPACE]; 
    Price price; 
    unsigned onHand; 
} Stock; 

Mon code à ce jour est la suivante:

Boolean loadStock(VmSystem * system, const char * fileName) 
{ 
    Stock data; 
    char id[ID_LEN + NULL_SPACE], name[NAME_LEN + NULL_SPACE], desc[DESC_LEN + NULL_SPACE]; 
    FILE *fp; 
    char str[200], *token; 

    if((fp = fopen(fileName, "r")) != NULL) 
    { 
     printf("File loaded\n"); 
    } 
    else 
    { 
     perror("Cannot open file"); 
     return FALSE; 
    } 

    if (fgets(str,sizeof(str),fp) == NULL) 
    { 
     perror("failed to read from file"); 
     return FALSE; 
    } 

    while(fgets(str,sizeof(str),fp) != NULL) 
    { 
     token = strtok(str, "|"); 
     while(token != NULL) 
     { 
      /** DO SOMETHING HERE **/ 
      printf("%s\n", token); 
      token = strtok(NULL,"|"); 

     } 
    } 

    fclose(fp); 
    return TRUE; 
} 

J'ai écrit ce mais cela ne fonctionne pas:

if(i%5 == 0) 
{ 
strcpy(id, token); 
} 
else if(i%5 == 1) 
{ 
    strcpy(name, token); 
} 
else if(i%5 == 2) 
{ 
    strcpy(desc, token); 
} 

printf("%s\n", id); 
token = strtok(NULL,"|"); 
i++; 
memset(id, '\0', sizeof(id)); 
memset(name, '\0', sizeof(name)); 
memset(desc, '\0', sizeof(desc)); 

je rencontre des problèmes en prenant le jeton et l'utiliser pour stocker des valeurs dans la structure

+1

Je vous suggère de ne pas faire le "tokenization" dans une boucle, mais plutôt d'une manière sérielle simple, avec cinq appels à 'strtok' l'un après l'autre. Puis copiez le jeton dans le membre de structure correct. –

Répondre

0

Vous pouvez lire chaque ligne du fichier avec fgets() dans une chaîne str et utiliser sscanf() pour lire cette chaîne.

Je suppose que Price est un typedef pour float.

Soit s soit une variable de type struct stock.

char str[200], pt[2][20]; 
Stock s; 
fgets(str, sizeof(str), fp); 
sscanf(str, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", s.id, s.name, s.desc, pt[0], pt[1]); 

Le %[^|] signifie lecture jusqu'à la rencontre d'un |. En savoir plus sur ce here

Les price et onHand éléments sont stockés dans pt[0] et pt[1] respectivement sous forme de chaîne. conversion chaîne à float est effectuée à l'aide strtof() tandis que la conversion à unsigned long est effectuée à l'aide strtoul()

s.price=strtof(pt[0], NULL); 
s.onHand=strtoul(pt[1], NULL, 10); 

Si vous êtes inquiet sur l'utilisation strtoul(), qui retourne un unsigned long int au lieu d'un unsigned int, vous pouvez d'abord vérifier si la valeur retournée par strtoul() est supérieur à UINT_MAX.

UINT_MAX est la valeur maximale pouvant être enregistrée dans un unsigned int.
Il est défini dans limits.h.