C 如何正确地从文本文件中的制表符分隔字段获取数据

C 如何正确地从文本文件中的制表符分隔字段获取数据,c,file-io,io,C,File Io,Io,我正在尝试学习如何从文本文件中以制表符分隔的字段导入数据。下面是我试图从名为users的外部文件中获取内容的示例。在中: 1 joshmith mypwd John Smith Awesome Road 103 2 jane_doe strongpwd Jane Doe Lucky Street 201 3 august84 goodpwd August May Red Boulevard 24 这里是用来保存数据的结构 type

我正在尝试学习如何从文本文件中以制表符分隔的字段导入数据。下面是我试图从名为
users的外部文件中获取内容的示例。在
中:

1   joshmith    mypwd   John    Smith   Awesome Road 103
2   jane_doe    strongpwd   Jane    Doe Lucky Street 201
3   august84    goodpwd August May  Red Boulevard 24    
这里是用来保存数据的结构

typedef struct User
{
    int id;
    char username[20];
    char password[40];
    char firstname[20];
    char lastname[20];
    char address[120];
} User;
。。。当然,应该处理该操作的代码:

User *u = (User *)malloc(sizeof(User)*4);
int i = 0;

    while (6 == fscanf(data_file, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\n", &(u+i)->id, (u+i)->username, (u+i)->password, (u+i)->firstname, (u+i)->lastname, (u+i)->address))
    {
        fprintf(stdout, "%d %s %s %s %s %s\n", (u+i)->id, (u+i)->username, (u+i)->password, (u+i)->firstname, (u+i)->lastname, (u+i)->address);
        i++;
    }
循环设法通过第一次迭代。。。然后它停止了。这里是输出:

1 joshmith mypwd John Smith Awesome Road 103
2
有人能帮我弄清楚为什么会这样吗?导入这种格式化数据的正确方法是什么?

我会将每一行读入一个字符串,然后使用with
\t
作为分隔符来提取标记;每行中的第一个标记可以使用转换为数字


注意:使用
atoi()
意味着将返回一个无效的数字作为zaero值,因此如果没有额外的逻辑,您无法区分这些值。格式字符串的问题是,您使用的最后一个扫描集是
%[^\t]
,而最有可能以
\n
结尾,当然,它可能以
\t
结尾。如果确定它以
\n
结尾,那么只需更改最后一个就足够了:

"%d\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\n]\n"
                         // changed this ^ from t to n
如果它也可能是
\t
,则可以使用以下选项:

"%d\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\n\t]%*[\n\t]"
// %[^\n\t] discards and assigns whatever found until a '\t' or '\n' is encountered
// %*[\n\t] discards and only discards '\n's and '\t's
// ... until something else is encountered

作为附加信息,格式字符串中的空格
'
与零个或多个空白字符匹配并丢弃它们。它本质上就像告诉
%*[\t\n]
-scanf
匹配任何(如果有的话)
'
'\t'
'\n'
,直到你遇到其他东西并丢弃它们。

@user3121023是!!非常感谢。为什么在格式化字符串的开头有额外的空间?这是为了什么?难道
%d
本身不应该放弃前面的空格吗?