将用户数据从文本文件存储到结构数组的C文件读取

将用户数据从文本文件存储到结构数组的C文件读取,c,C,我有一个函数getData(),它应该读取一个文本文件“Users.txt”,并将文本文件的数据存储在一个声明为user[20]的结构数组中 结构定义为: typedef struct userTag { int ID; string10 password; string20 name; string30 address; string15 contactNum; } userType; 文本文件格式如下: <ID> <password

我有一个函数getData(),它应该读取一个文本文件“Users.txt”,并将文本文件的数据存储在一个声明为user[20]的结构数组中

结构定义为:

typedef struct userTag {
    int ID;
    string10 password;
    string20 name;
    string30 address;
    string15 contactNum;
} userType;
文本文件格式如下:

<ID> <password>
<name>
<address>
<contact num>

112 pass222
Ginge Akerwood
Camella Homes
0922294812

119 h3yo2
Marian Nilza Ginge
Camella
0999222444

我真的找不到关于如何在网上阅读文件的好资源,所以我不得不在这里提问。此外,文本文件的格式无法更改,因此必须以这种方式读取

扫描之后,文件指针位于行末尾的换行符上。第一个fgets返回缓冲区,其中只包含该换行符,而不包含其他内容。第二个FGET读取包含名称的行。最简单的修复方法可能是使用:

fscanf(fp_users,"%d %s\n")

但在我看来,这是一件既粗糙又脆弱的事情。最好只使用
scanf
fgets
,不要将两者混用。例如,使用
fscanf(“%19[^\n]”,u->name)
来读取名称,而不是使用
fgets
。格式字符串中的前导空格为您去除空白。请注意,我假设您将递增
u
,以便
->
有效。它比
u[i].name更简洁,应该使用。

在scanf之后,文件指针位于行尾的换行符上。第一个fgets只返回该换行符。请不要混合使用
fgets
fscanf
。请注意,使用
fgets
时,字符串中会有一个尾随的换行符,需要修改。您的技巧
fscanf(fp_用户、%c、&dump)
正在尝试删除下一个字符。类型如何/在何处
string10
string20
string30
string15
定义这有帮助,唯一剩下的问题是额外的\n所以我必须手动删除它。谢谢。请注意,
scanf
格式字符串中的
'\n'
等于空格,即任何空格,因此仅使用空格就不那么容易混淆。@hyde提出了一个有效的观点,但在我看来,显式
\n
实际上在这里更好,因为它向读者传达的正是要匹配的内容。但这仍然是错误的做法。@rykker。是的。我倾向于同意使用
%19[^\n]“
格式字符串而不是
fgets
@ryker。我几乎肯定只会使用
fgets
,而只是开始回答有关
scanf
的问题,以克服我像瘟疫一样避免它的自然倾向。事实证明,它并没有那么糟糕,但我非常坚定地认为,任何学习这门语言的人都不应该使用它。这是一场灾难,因为它经常在入门课程中教授。
User ID: 112
User ID: 922294812
User ID: 999222444
fscanf(fp_users,"%d %s\n")