【问题标题】:Read a text file using fscanf() in a while loop在 while 循环中使用 fscanf() 读取文本文件
【发布时间】:2021-06-22 04:29:06
【问题描述】:

所以我试图在 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'至少返回 2,因为它成功地有两个值,即 2 和 50。但它总是返回 0。

【问题讨论】:

  • 您必须根据您希望它解析的参数数量来测试fscanf 的返回值。在您的情况下,这将是 2 并且任何其他值都表示错误(或 EOF)。

标签: c while-loop scanf


【解决方案1】:

在输入中允许空格

"(%d,%d)" 不读取括号之间的空格:) (。在'('')'',' 之前允许空格。 "%d" 已经允许前导空格。

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

比较目标,而不是失败的目标之一

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

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

【讨论】:

    【解决方案2】:

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

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

    或通过

    fscanf(fp, "(%d,%d) ", &key, &value)。在这里你明确地读取了空间。

    注意:

    我不知道你为什么只是在之后才打印支票,你实际上是在跳过一对,小心。

    【讨论】:

    • 谢谢!如果对之间的空格数不同怎么办?我有检查来测试每个循环的 fscanf 返回值,但它总是返回 0,你能解释一下为什么吗?
    • 一个空格告诉fscanf忽略所有后面的空白字符,包括\n
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多