2017-09-25 62 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 

構造を::データ構造は、例えば、このような入力を持つファイルから来る私がこれを書いた

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

:これまで

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; 

私のコードはこれですそれは動作しません:

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

は、私はいくつかの問題がトークンを取り、あなたが文字列strfgets()を持つファイルから各行を読み込み、その文字列からの読み取りにsscanf()を使用することができます構造

+1

"トークン化"をループ内で行うのではなく、単純なシリアルの方法で、それぞれの後に 'strtok'を5回呼び出すことをお勧めします。トークンを正しい構造体のメンバーにコピーします。 –

答えて

0

に値を格納するためにそれを使用して過ごしています。

Priceは、の場合、typedefと仮定します。

sをタイプ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]); 

%[^|]手段は|に遭遇までお読みください。それについての詳細を読むhere

priceonHand要素は文字列形式でそれぞれpt[0]pt[1]に格納されています。 unsigned longへの変換は、あなたの代わりにunsigned intunsigned long intを返しstrtoul()を、使用して心配している場合、値がで返された場合、あなたが最初にチェックすることができstrtoul()

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

を使用して行われている間floatへ 文字列変換はstrtof()を使用して行われますstrtoul()UINT_MAXより大きい。

UINT_MAXは、unsigned intに格納できる最大値です。
limits.hで定義されています。

関連する問題