我正在使用vc2010,我正在尝试将文件的内容读取到结构中,如下所示,它给了我运行时错误。
char buf[100];
char *token = NULL;
while( fgets (buf , 100 , rd) != NULL )
{
token = strtok( buf,", ");
test_st.fp.chunk_offset = atol(token);
printf("\n %llu ", test_st.fp.chunk_offset);
//OPTION 1: if i do this there will be no runtime error but the same
// value as the first token will be assigned to chunk_length
token = strtok(buf, ",");
//OPTION 2: this line gives error in the second while loop iteration
token=strtok(NULL,",");
test_st.fp.chunk_length = atol(token);
printf("%llu ", test_st.fp.chunk_length);
token = strtok(NULL, " ");
....
}
我的另一个问题是如何使用strtok()或any-如果有的话 - 将一个非常长的字符串(如下面文件内容中的第二个昏迷之后的字符串)分配到结构数据成员中(在这种情况分为 fp.fing_print )?
这是我试图阅读的文件的第一部分
0,4096,2ed692b40e335f7c20b71c5ed0486634
4096,3028,da40bf20c8ff189087b8bd7e8580118a
7124,2177,e6dfaee81e96095d302c82f9fd73dc55
9301,1128,76201eadff3c89a381a314ed311f75ff
我试图将其读入的结构定义是:
typedef struct fpinfo
{
unsigned long chunk_offset;
unsigned long chunk_length;
unsigned char fing_print[32];
}fpinfo;
typedef struct Hash_Entry {
struct Hash_Entry *next; /* Link entries within same bucket. */
unsigned namehash; /* hash value of key */
struct fpinfo fp;
} Hash_Entry;
编辑:
是的你是对的我必须使用第二个选项
我已经找到了这个问题。该文件在每一行之间都有空行,当它到达这些空行时会显示错误消息。
但我遇到另一个问题,我必须将每一行的最后一部分读入结构的数组成员( fp.fing_print )。
谢谢大家的帮助!!!
编辑: fing_print [32]数组应该包含32个字符,这些字符是md5散列函数的结果。我不确定我是否必须使它成为一个空终止字符串。如果你们能给我一个关于它的提示,我将非常感激。
答案 0 :(得分:1)
您需要检查NULL返回:
if ((token = strtok(buf, ",")) {
// must have found a comma
}
if (token && (token = strtok(NULL,"'")) {
// Two in a row: I found a comma and then I found an apostrophe
}
...
答案 1 :(得分:1)
如paulsm4所述,您需要检查strtok()
返回值。以下代码有效并包括字符串的创建:
while( fgets (buf , 100 , rd) != NULL )
{
token = strtok(buf,", \n");
if (0 != token)
{
test_st.fp.chunk_offset = atol(token);
printf("\tchunk_offset=%lu\n", test_st.fp.chunk_offset);
token = strtok(0, ", \n");
}
if (0 != token)
{
test_st.fp.chunk_length = atol(token);
printf("\tchunk_length=%lu\n", test_st.fp.chunk_length);
token = strtok(0, ", \n");
}
if (0 != token)
{
/* EDIT: fing_print datatype changed. */
memset(test_st.fp.fing_print, 0, sizeof(test_st.fp.fing_print));
strncpy(test_st.fp.fing_print,
token,
sizeof(test_st.fp.fing_print) - 1);
/* test_st.fp.fing_print = _strdup(token); */
printf("\tfing_print=[%s]\n", test_st.fp.fing_print);
}
printf("\n");
}
分隔符设置为", \n"
,因为fgets()
会将换行符读入buf
。