2017-09-25 61 views
0

我有必须添加到链接列表中的数据结构。该数据结构将来自一个文件,这样,例如输入:从文件中分割字符串然后存储到结构中

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 

结构:

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; 

到目前为止我的代码是这样的:

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

我写了这但它不起作用:

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)); 

我有一些问题采取的令牌,并用它来存储值到结构

+1

我建议你不要在循环中做“标记化”,而应该用简单的连续方式,在彼此之后对'strtok'进行5次调用。然后将该令牌复制到正确的结构成员中。 –

回答

0

您可以读取与fgets()文件每行到一个字符串str,并使用sscanf()从字符串读取。我想Pricetypedeffloat

sstruct 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]); 

%[^|]读取,直到遇到一个|手段。了解更多关于它here

priceonHand元素存储在pt[0]pt[1]分别以字符串形式。 字符串转换为float使用strtof()而转化为unsigned long使用strtoul()

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

如果你担心使用strtoul(),它返回一个unsigned long int而不是unsigned int的所做的一切,你可以先检查值由归国strtoul()大于UINT_MAX

UINT_MAX是可存储在unsigned int中的最大值。
它在limits.h中定义。