fscanf和EOF中的负扫描集

时间:2013-01-24 21:03:39

标签: c file-io eof scanf

我的文件中有一个以逗号分隔的字符串列表:

名称1,名称2,名称3,

我想阅读那些跳过所有逗号的名字。我写了以下循环:

while(true)
{
    if(fscanf(file, "%[^,],", my_string) != 1)
    {
        break;
    }

    //...
}

然而,它总是比它应该再执行一次。给定文件中的3个名称,循环将执行其语句4次。为什么会这样? EOF指标是否排在我的否定扫描集 [^,] ?如果是这样,那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我很确定这正是你想要的。对我所做算法的唯一修改是在格式字符串中的%之前添加前导空格清除。另外,我修改了这个来从命令行arg打开文件。更容易测试这种方式。希望没关系。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
        return EXIT_FAILURE;

    FILE *fp = fopen(argv[1], "r");
    if (NULL == fp)
        return EXIT_FAILURE;

    char str[100];
    int count=0;
    while (1)
    {
        if(fscanf(fp, " %[^,],", str) != 1)
            break;
        printf("%s\n", str);
        ++count;
    }

    printf("Parsed %d strings.", count);
    return EXIT_SUCCESS;
}

<强>输出

Name 1
Name 2
Name 3
Parsed 3 strings.

我相信你所看到的循环中的“第四次”执行是失败条件,由于无法解析而导致循环中断,除非我遗漏了某些东西或者没有理解你正在目击的东西。

答案 1 :(得分:0)

为什么循环语句执行4次。在第4个fscanf语句之后循环中断并且下面的代码没有被执行.EOF指示符没有排列到你的否定集合但是你可能正在寻找一个更紧凑的解决方案:

while(fscanf(file, "%[^,],", my_string)!=EOF )
    {

        //do something
    }

如果没有,请发布更详细的代码和测试文件