fscanf和EOF中的否定扫描集

fscanf和EOF中的否定扫描集,c,file-io,eof,scanf,C,File Io,Eof,Scanf,我的文件中有一个逗号分隔的字符串列表: 名字1,名字2,名字3 我想读那些名字,跳过所有的逗号。我编写了以下循环: while(true) { if(fscanf(file, "%[^,],", my_string) != 1) { break; } //... } 然而,它总是比预期执行多一次。给定文件中的3个名称,循环将执行其语句4次。为什么会这样?EOF指示器是否与我的否定扫描集排序[^,]?如果是这样的话,那么我该如何解决这个问题呢?我

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

名字1,名字2,名字3

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

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

    //...
}

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

我很确定这正是你想要的。我对算法的唯一修改是在格式字符串中的
%
之前添加了前导空白。另外,我修改了它,从命令行参数打开文件。这样更容易测试。希望没问题

#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;
}

我相信您看到的循环中的“第四个”执行是失败条件,它会由于解析失败而中断循环,除非我遗漏了什么或不理解您看到的内容。

为什么您的循环语句执行了4次。循环在第4个fscanf语句后中断,下面的代码未执行。EOF指示符不属于您的否定集,但您可能正在寻找一种更紧凑的解决方案,如下所示:

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

        //do something
    }

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

您的文件末尾是否有行尾字符?也许会被扫描?(然后明确地检查它。顺便说一句,EOF不是可以扫描的“字符”)我的装备上的第四次执行返回0(没有处理任何参数)。您是否希望它解析最后一个字符串并同时返回0?(侧边栏,以“%”开头。注意空格,它会在下一个字符串开头抛出任何前导空格。)@Quentin它必须有失败的机会。最后一次解析第三个字符串成功,第四个字符串失败,因为数据不足。Thx,空格就是解决方案。但是为什么呢?EOF紧跟在文件中最后一个逗号之后,它们之间没有其他字符…即使到达EOF,最后一个解析之前仍然成功(第三个字符串)。中断条件是当解析失败时;不是在EOF。这样其实更好。
while(fscanf(file, "%[^,],", my_string)!=EOF )
    {

        //do something
    }