2

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

姓名 1,姓名 2,姓名 3,

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

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

    //...
}

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

4

2 回答 2

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.

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

于 2013-01-24T21:38:02.280 回答
0

为什么你的循环语句执行 4 次。第 4 条 fscanf 语句后循环中断,并且不执行下面的代码。EOF 指标不排名到您的否定集但是也许您正在寻找更紧凑的解决方案,如下所示:

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

        //do something
    }

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

于 2013-01-24T21:47:02.893 回答