我有数据结构我必须添加到链表中。数据结构将来自具有这样输入的文件,例如:
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));
我在获取令牌并使用它将值存储到结构
时遇到了一些问题答案 0 :(得分:0)
您可以将包含fgets()
的文件中的每一行读入字符串str
,并使用sscanf()
从该字符串中读取。
我认为Price
是typedef
的{{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
元素分别以字符串形式存储在onHand
和pt[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
中定义。