在使用visual studio 2012时,我正在使用两个文件。一个是phonenumber.db
,另一个是user.db
。虽然这些格式有.db格式,但实际上是用文本编写的,并保存为.db格式。
phonenumber.db
仅包含数字。例如)
00123123
01231245
09102312
user.db
包含日期,以数字表示的其他本地信息等。
20160922 1029000001245123 DAVID HENRY
20192034 1029300275718283 MARK LO
所以我用fgets来读取phonenumber,并查找user.db中是否有匹配的信息。
我的代码看起来像这样,
FILE *phoneDB = fopen(/directory of phonenumber.db, "rb");
FILE *userDB = fopen (~~~);
bool numfindFlag = False;
char phonereadbuffer[PHONELEN + 2];
char userreadbuffer[INFOLEN+2];
while(!numfindFlag && fgets(phonereadbuffer, PHONELEN + 2, phoneDB) {
while(!numfindFlag && fgets(userreadbuffer, INFOLEN + 2, userDB) {
----some function works here ----
}
}
然而,问题是,当我检查日志时,fgets()
奇怪地工作。 它在user.db中读取相同的行两次,并在读取所有数字部分后,虽然我指定INFOLEN
大小只读取数字部分,但它也读取其他字符部分。
它应该只读20160922 1029000001245123
,但它也会显示DAVID HENRY MARK,LO部分。
为什么会这样?使用fgets()
时是否缺少某些内容?
答案 0 :(得分:3)
你有两个嵌套的while循环:
while(!numfindFlag && fgets(phonereadbuffer, PHONELEN + 2, phoneDB) {
while(!numfindFlag && fgets(userreadbuffer, INFOLEN + 2, userDB) {
这实质上意味着:
这里可能有两个错误:
更容易编写的实现只是逐行读取文件,并可以使用strncmp进行匹配检查。
答案 1 :(得分:0)
您的问题似乎是每次调用时都希望fgets
在新行上开始。但是,这不是它的工作原理。因此,您必须自己阅读其余内容。
此外,您必须确保每次都返回到userDB文件的开头。
所以你的代码可以看起来:
while(!numfindFlag && fgets(phonereadbuffer, PHONELEN + 2, phoneDB)) {
FILE *userDB = fopen ("user.db", "r");
if (!userDB)
{
fclose(phoneDB);
printf("file error...\n");
return 0;
}
while(!numfindFlag && fgets(userreadbuffer, INFOLEN + 2, userDB)) {
// ----some function works here ----
// Read until end of line
while (strlen(userreadbuffer) &&
userreadbuffer[strlen(userreadbuffer) - 1] != '\n' &&
fgets(userreadbuffer, INFOLEN + 2, userDB));
}
fclose(userDB);
}