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

Mar*_*ors 4 c file-io scanf

我有一个问题,但找不到有效的解决方案。这真的很容易,但是我不知道该怎么办。

我有一个带有几行的文件,例如:

\#comment

\#comment

icecream 5

pizza 10

pie 7

\#comment

tortillas 5
fajitas 5
Run Code Online (Sandbox Code Playgroud)

而且我希望我的程序只阅读不以开头的行#

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");
Run Code Online (Sandbox Code Playgroud)

小智 5

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


while(!strcmp(first,"#")
Run Code Online (Sandbox Code Playgroud)

是错的。你想筛选出其中线与启动一个井号,而不是在那些它只不过是一个井号。另外,while(!feof(f))是错误的。此外,如果您要逐行阅读,为什么fscanf()在可以利用的情况下还要打扰fgets()呢?

总而言之,整个巨大while循环可以简化为以下形式:

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

    // do stuff
}
Run Code Online (Sandbox Code Playgroud)


das*_*ght 5

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

fscanf(pf, "%*[^\n]");
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 4

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

char ignore[1024];

fgets(ignore, sizeof(ignore), pf);
Run Code Online (Sandbox Code Playgroud)