在C中读取文件时跳过一行

时间:2013-04-19 15:19:27

标签: c file-io scanf

我遇到了问题,但我找不到有效的解决方案。这很容易,但我不明白该怎么做。

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

\#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 个答案:

答案 0 :(得分:4)

如果不读取以#开头的行,就没有真正的方法可以到达下一行。您可以做的就是读取该数据,但忽略它。

char ignore[1024];

fgets(ignore, sizeof(ignore), pf);

答案 1 :(得分:4)

如果您需要阅读配置文件,请use the right tool instead of reinventing the wheel.


while(!strcmp(first,"#")

错了。您希望过滤掉哈希符号开头的行,那些只是哈希符号的行。此外,{ {1}}错了。此外,如果您逐行阅读,那么当您可以利用while(!feof(f))时,为什么还要使用fscanf()呢?

总而言之,整个巨大的fgets()循环可以简化为:

while

答案 2 :(得分:3)

通过应用%*[^\n]格式说明符

,您可以在不使用缓冲区的情况下跳到行尾
fscanf(pf, "%*[^\n]");

答案 3 :(得分:1)

您可能希望使用strstr查找“#”。

参见说明: http://en.cppreference.com/w/c/string/byte/strstr