从文件中拆分字符串然后存储到结构中

时间:2017-09-25 07:20:13

标签: c file strtok

我有数据结构我必须添加到链表中。数据结构将来自具有这样输入的文件,例如:

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 个答案:

答案 0 :(得分:0)

您可以将包含fgets()的文件中的每一行读入字符串str,并使用sscanf()从该字符串中读取。

我认为Pricetypedef的{​​{1}}。

float成为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

|price元素分别以字符串形式存储在onHandpt[0]中。 使用strtof()完成使用pt[1]的字符串转换,使用strtoul()转换为float

unsigned long

如果您担心使用返回s.price=strtof(pt[0], NULL); s.onHand=strtoul(pt[1], NULL, 10); 而不是strtoul()的{​​{1}},您可以先检查unsigned long int返回的值是否大于{ {3}}。

unsigned int是可以存储在strtoul()中的最大值 它在UINT_MAX中定义。