簡體   English   中英

在 C 中讀取文件時跳過一行

[英]Skip a line while reading a file in C

我有一個問題,我還沒有找到有效的解決方案。 這真的很容易,但我不明白該怎么做。

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

#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");

如果您需要讀取配置文件,請使用正確的工具而不是重新發明輪子。


while(!strcmp(first,"#")

是錯的。 您想過濾掉以井號開頭的行,而不是那些只是井號的行。 另外, while(!feof(f))是錯誤的。 此外,如果您正在逐行閱讀,既然可以利用fgets()代替,為什么還要使用fscanf()呢?

總而言之,整個巨大的while循環可以簡化為這樣的:

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

    // do stuff
}

通過應用%*[^\\n]格式說明符,您可以在不使用緩沖區的情況下跳到行尾:

fscanf(pf, "%*[^\n]");

如果不閱讀以#開頭的行,就沒有真正的方法可以進入下一行。 您所能做的就是讀取該數據,但忽略它。

char ignore[1024];

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM