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

6
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个问题,但我还没有找到有效的解决方案。这很简单,但我不知道该怎么做。

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

#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个回答

6
您可以使用%* [^ \ n]格式说明符跳过行末的缓冲区而不使用缓冲区:
fscanf(pf, "%*[^\n]");

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
}

嗯,while(!feof(f)) 这个做法是有效的,并且这也是我的教授举的例子,所以我有点糊涂 :-D 不过无论如何,您的解决方案非常好,我只需要从缓冲区读取单词即可,这并不难。谢谢! - MarkWarriors
@user2299689 现在可能能够工作,但是它是错误的。(我可以引用一些例子,当我修复“教授们”的代码示例/语句/断言中的巨大错误时。) - user529758

4

没有什么真正的方法可以在不阅读以 # 开头的行的情况下进入下一行。你所能做的就是读取这些数据,但忽略它。

char ignore[1024];

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

1
我觉得可以尝试另一种方法,比如当我读到"#"时,开始一个新的循环,继续读取直到行结束符(我认为是"\n")。 - MarkWarriors
好的,我也尝试了你的忽略方式。现在我有三种不同的方法来做到这一点,而且都有效 :) 谢谢! - MarkWarriors

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接