函数strtok()和C中的混合变量类型

时间:2018-12-03 01:30:34

标签: c struct file-io strtok

我试图从文件中读取数据并将数据插入到struct数组中,文件的格式如下:

...
0087|www.google.com|2017.08.07 12:13:36
0150|www.yahoo.com|2018.10.06 04:03:12
...

其中数据类型以'|分隔,然后我使用strtok()分隔数据,这对于字符串类型timestampdomain都很好,我能够将数据正确存储在结构中,但是,对于数据类型customerid,我只能在结构中获取内存地址,我该如何解决呢?谢谢!

#include <stdio.h>
#include <string.h>

struct AccessRecord {       
    int customerID;         
    char domain[256];
    char timestamp[21]; 
    };

struct AccessRecord rc[1000];


int main()
{
    int i = 0; char line[300]; 
    const char s[2] = "|";

    FILE *fd;
    fd = fopen("./example_data.ipb","r");


    while (fgets(line, sizeof(line), fd)) {

        char *token;

        token = strtok(line, s);

        rc[i].customerID = token;
        token = strtok(NULL, s);

        strcpy (rc[i].domain , token);
        token = strtok(NULL, s);


        strcpy (rc[i].timestamp , token);
        token = strtok(NULL, s);

        i++;
    }
    fclose(fd);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

请注意您提取数据的两种不同方式:

token = strtok(line, s);
rc[i].customerID = token;       // assignment of char* (to int, so suspect)

token = strtok(NULL, s);
strcpy (rc[i].domain , token);  // string copying

尽管事实上这两个都是字符串。尽管客户ID是数字数据,但它存储为字符串,应这样对待。

换句话说,由于它是结构中的整数,因此您可以在读取时将其转换,例如:

token = strtok(line, s);
rc[i].customerID = strtol(token, NULL, 10);