-1

如何扫描文件中的单词,然后在 C 编程中打印包含该单词的行?

我正在尝试找到一种方法来扫描文件以查找关键字,然后仅打印包含该单词的行。我的开始很艰难。这是我所拥有的:

#include <stdio.h>

void getDsk (void);

void getDsk ()
{
FILE* fp;
char result [1000];
fp = popen("diskutil list","r");
fread(result,1,sizeof(result),fp);
fclose (fp);

while(!feof(fp)) {
        if(//line contains "Test".)
        {
            //show line.
        }
    }
}

int main(int argc, const char * argv[])
{
    getDsk();
    return 0;
}

编辑:这做了我需要的。

#include <stdio.h>

void getDsk (void);

void getDsk ()
{
    printf("Your available Windows installations are:\n");
    FILE* fp = popen("diskutil list","r");
    char line[1024];
    while(fgets(line, sizeof(line), fp)) 
    {
        if (strstr(line,"Microsoft")) 
        {
            printf("%s", line);
        }
        // if line contains the text, print it
    }
}

int main(int argc, const char * argv[])
{
    getDsk();
    return 0;
}
4

2 回答 2

3

在您当前的代码中,看起来您正在一次将整个文件读入result,因此没有“行”的概念。

我建议更改循环,以便一次读取一行文件。
调查fgets
在每一行上,检查该行的关键字(strstr)。

while(fgets(line, sizeof(line), fp)) {
    if (strstr(line, keyword) != NULL) {
        puts(line);   // if line contains the text, print it
    }
}
于 2012-06-05T18:44:36.557 回答
2

一些东西:

1)你几乎不应该写while(!feof(fp)) { ... }它是一个损坏的模式,因为它feof只会在读取尝试后返回 true。因此,您很容易因一个错误而关闭。

2)你为什么要这样做?

fp = popen("diskutil list","r");
fread(result,1,sizeof(result),fp);
fclose (fp);

您正在读取1000文件的字符然后将其关闭,然后您的存根代码就像它计划再读取文件一样......没有任何意义。

3)这是一个合理的方法:

char line[1024];
while(fgets(line, sizeof(line), fp)) {
    // if line contains the text, print it
}

这里发生的事情是fgets读取一行并返回 non-NULL如果它成功。(在测试中使用时NULL被视为“假”,非NULL是“真”)。

所以它说“虽然我们可以成功读取一行,但请执行以下操作”,这确实是您想要的。另外,我假设没有行会超过1024字符,这通常是一个合理的假设,如果不是这种情况,那么您将需要相应地进行调整。

于 2012-06-05T18:45:16.007 回答