2017-09-25 26 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中定義。

相關問題