5

我有一个问题,我还没有找到有效的解决方案。这真的很容易,但我不明白该怎么做。

我有一个包含一些行的文件,例如:

#comment

#comment

icecream 5

pizza 10

pie 7

#comment

tortillas 5
fajitas 5

我希望我的程序只读取不以#.

FILE *pf;
char first [20], second [20];
pf = fopen("config.conf", "r");
if (pf)
{
    while (! feof(pf))
    {
        fscanf(pf, "%s \t ", first);
        while(!strcmp(first,"#")){ `HERE I NEED JUMP TO NEXT LINE`
            fscanf(pf, "%s \t ", first);
        }
        fscanf (pf, "%s \t ", second);
        printf("Food: %s \t Cost: %s \n", first, second);
    }
    fclose(pf);
}
else
    printf( "Errore nell'aprire config.conf\n");
4

4 回答 4

5

如果您需要读取配置文件,请使用正确的工具,而不是重新发明轮子。


while(!strcmp(first,"#")

是错的。您想过滤掉以井号开头的行,而不是那些只是井号的行。还有,while(!feof(f))错了。此外,如果您是逐行阅读,为什么要fscanf()在可以利用的时候麻烦使用fgets()呢?

总而言之,整个巨大的while循环可以简化成这样的:

char buf[0x1000];
while (fgets(buf, sizeof(buf), pf) != NULL) {
    if (buf[0] == '#') continue;

    // do stuff
}
于 2013-04-19T15:23:30.343 回答
5

%*[^\n]您可以通过应用格式说明符跳到行尾而不使用缓冲区:

fscanf(pf, "%*[^\n]");
于 2017-08-17T11:17:52.760 回答
4

如果不阅读以#. 您所能做的就是读取该数据,但忽略它。

char ignore[1024];

fgets(ignore, sizeof(ignore), pf);
于 2013-04-19T15:23:03.670 回答
1

您可能想使用 strstr 来查找“#”。

见描述: http ://en.cppreference.com/w/c/string/byte/strstr

于 2013-04-19T15:26:48.210 回答