在 while 循环中使用 fscanf() 读取文本文件

Read a text file using fscanf() in a while loop

因此我尝试在 while 循环中使用 fscanf() 从输入文本文件中读取数字对。文本文件类似于以下内容:

(2, 50) (4, 30) (9, 30) (10, 400) (-5, -40)
(7, 20) (19, 200) (20, 50) (-18, -200) (-2, 29)

我的代码是:

int main()
{
    FILE *fp;
    fp = fopen("File", "r");
    if (fp == NULL)
    {
        perror("Invalid input!");
        return 0;
    }
    else
    {
        int key, value;
        int check;
        while (fscanf(fp, "(%d,%d)", &key, &value) != EOF)
        {
            printf("(%d, %d)\n", key, value);
            check = fscanf(fp, "(%d,%d)", &key, &value);
            printf("%d", check);
        }
    }
    return 0;
}

但是输出不是遍历文件中的每一对,而是无限地打印 (2,50)。有人可以帮我修复我的代码吗?

我也希望至少 'check' returns 2 因为它成功地获得了两个值 2 和 50。但它总是 return 0.

之后您必须阅读 space,这可以通过以下方式完成:

fscanf(fp, "(%d,%d)%*c", &key, &value)。这里 %*c 正在读取一个字符并将其丢弃。

或通过

fscanf(fp, "(%d,%d) ", &key, &value)。在这里你明确地阅读了 space.

注:

我不确定你为什么只在事后打印支票,你实际上是在跳过一对,请注意这一点。

在输入中允许白色-space

"(%d,%d)" 不读取括号之间的 space:) (。在'('')'','之前允许白色-space。 "%d" 已经允许前导白色-space.

// while (fscanf(fp, "(%d,%d)", &key, &value) != EOF)
while (fscanf(fp, " (%d ,%d )", &key, &value) != EOF)
//                 ^   ^   ^ 

对比目标,没有一个失败的目标

fscanf(fp, " (%d ,%d )"... returns 2,1,0,EOF。只有当 return 值为 2 时,循环才会继续。使用 != EOF,当 return 值为 2,1 或 0 时循环继续。

// while (fscanf(fp, " (%d ,%d )", &key, &value) != EOF)
while (fscanf(fp, " (%d ,%d )", &key, &value) == 2)