使用fgets只读取部分文件

时间:2016-07-21 11:25:48

标签: c visual-studio fgets

在使用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()时是否缺少某些内容?

2 个答案:

答案 0 :(得分:3)

你有两个嵌套的while循环:

while(!numfindFlag && fgets(phonereadbuffer, PHONELEN + 2, phoneDB) {
  while(!numfindFlag && fgets(userreadbuffer, INFOLEN + 2, userDB) {

这实质上意味着:

  • 你读了一个phonelen + 2条记录
  • 你读了一个被盗的+2记录
  • 在你遗漏的循环体中发生了什么
  • 你读了一个被盗的+2记录
  • 循环体中发生了一些事情......
  • 你读了一个被盗的+2记录
  • ...
  • 当numfindFlag变为假时停止

这里可能有两个错误:

  • 如果你没有阅读到终结字符的所有内容,那么第二个被盗的阅读将会读取一个字符串。
  • 即使您确实正确读取了字符串,也不会再次阅读phonelen记录。

更容易编写的实现只是逐行读取文件,并可以使用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);
}