gpt4 book ai didi

C - 从文件中读取特定行

转载 作者:行者123 更新时间:2023-11-30 14:28:41 25 4
gpt4 key购买 nike

我正在尝试从文件中读取特定行,我可以获取行号,但我不确定如何去做,这是我到目前为止所拥有的:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
FILE *file;
file = fopen("temp.txt","r");
char tmp[256]={0x0};
char *tmpline;
int numline = 1;
while(file != NULL && fgets(tmp, sizeof(tmp),file) !=NULL)
{
tmpline = strstr(tmp,"status:green");

if(tmpline) {
printf("%d - %s", numline, tmpline);
}

numline++;
}
if (file != NULL) fclose(file);

return 0;
}

测试文件如下所示:

s1.server.com
127.0.0.1
status:green

s2.server.com
127.0.0.1
status:red

s3.server.com
127.0.0.1
status:red

s4.server.com
127.0.0.1
status:green

我的输出是:

3 - status:green 
15 - status:green

但我真正希望它显示的是:

s1.server.com
s4.server.com

我希望它搜索“status:green”,然后返回几行以显示它属于哪个服务器

最佳答案

听起来好像您需要做两件事之一。

更简单的选项:保留一些行的循环缓冲区。读入第 0 行、第 1 行、第 2 行、...、第 n-1 行、第 0 行、第 1 行等。然后,当您看到所需的文本时,查看entry (current_index - 2) mod buffer_size。 (这里听起来好像缓冲区大小为 3 就足够了。)

更复杂的选项:实际解析输入,以便为每个 block 计算出服务器名称、其 IP 地址及其状态,然后使用它显示您需要的信息。

“更复杂的选项”会做更多的工作,但如果输入的语法发生变化,它会更加健壮(例如,使用可选的额外行来提供有关服务器的更多信息 - 可能是多个 IP 地址或多个名称) .

还有一些我认为更糟糕的事情你可以做。 (1) 在每一行调用ftell并将that的结果放入循环缓冲区中,然后在看到“status:”时使用fseek绿色的”。 (2) 使用您当前拥有的代码读取整个文件,建立“良好”服务器行号的列表。然后再次查看文件并报告好的内容。我认为这些方法比我上面列出的方法更丑陋且效率更低。有一个可能的优点:您可以调整它们以计算由空行分隔的“节”,而无需正确解析内容。这将使您获得我提到的“更复杂”方法的灵 active ,而不需要适当的解析器。

这是一种混合可能性:不使用循环缓冲区,但如果需要,其大小可以增加。每次看到空行时,从缓冲区中的第一个条目开始。如果存在“长”节,则让缓冲区增长。然后,当您看到“status:green”时,对缓冲区中现在保存的(大概是完整的)节进行所需的任何处理。

当然,如果您确定文件格式永远不会改变,则上述内容都不是必需的。

关于C - 从文件中读取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com