【问题标题】:How do I extract a specific numbered line from a text file? (C)如何从文本文件中提取特定编号的行? (C)
【发布时间】:2013-04-23 03:43:04
【问题描述】:

我正在尝试编写一个函数,该函数根据给定的数字从文本文件中打印特定行。例如,假设文件包含以下内容:

1 hello1 one
2 hello2 two
3 hello3 three

如果给定的数字是'3',函数将输出“hello3 three”。如果给定的数字是“1”,则函数输出将为“hello1 one”。

我对 C 很陌生,但到目前为止,这是我的逻辑。

我想第一件事是首先,我需要在文件中找到字符“数字”。然后呢?如何在不包括数字的情况下写出线路?我什至如何找到“数字”?我确信这很简单,但我不知道该怎么做。这是我目前所拥有的:

void readNumberedLine(char *number)
{
    int size = 1024;
    char *buffer = malloc(size);
    char *line;
    FILE *fp;
    fp = fopen("xxxxx.txt", "r");
    while(fp != NULL && fgets(buffer, sizeof(buffer), fp) != NULL)
    {
      if(line = strstr(buffer, number))
      //here is where I am confused as to what to do.           
    }
    if (fp != NULL)
    {
            fclose(fp);
    }
}

任何帮助都将不胜感激。

【问题讨论】:

  • 根据问题定义,我认为无论内容如何,​​您都想要第三行。但是,您的解决方案似乎找到了包含“3”的行。你要哪一个?
  • @Arun,我想他想要第 3 行,但他写了一个结果出乎意料的代码来实现这个目标。
  • 对不起,如果参数是'1',那么它将是“hello1 one”等等。如果参数是'2',那么将打印“2”之后的同一行的内容。
  • 一行可以hello5 six吗?如果是这样,当输入为 5 或 6 时会发生什么?
  • @Anish 如果在文件中找不到数字 5 或 6,则肯定会出错。但是,如果文件中包含编号为 5 或 6 的行,则将打印该行(不带标记)。我希望这是有道理的。

标签: c string file


【解决方案1】:

根据您所说的,您正在寻找在行首标有数字的行。在这种情况下,您想要一些可以读取带有标签前缀的行的东西

bool readTaggedLine(char* filename, char* tag, char* result)
{
    FILE *f;
    f = fopen(filename, "r");
    if(f == NULL) return false;
    while(fgets(result, 1024, f))
    {
        if(strncmp(tag, result, strlen(tag))==0)
        {
            strcpy(result, result+strlen(tag)+1);
            return true;
        }
    }
    return false;
}

然后像这样使用它

char result[3000];
if(readTaggedLine("blah.txt", "3", result))
{
    printf("%s\r\n", result);
}
else
{
    printf("Could not find the desired line\r\n");
}

【讨论】:

  • 这真是太聪明了,我什至没有想到要加入一个布尔函数。此外,像您一样使用 strncmp() 会简单得多。谢谢!
  • 我更喜欢传入一些东西。尤其是内存分配。我更喜欢传递缓冲区,这意味着您可以根据需要将它与 malloc 或静态内存一起使用。
【解决方案2】:

我会尝试以下方法。

方法一:

Read and throw away (n - 1) lines 
// Consider using readline(), see reference below
line = readline() // one more time
return line

方法二:

Read block by block and count carriage-return characters (e.g. '\n'). 
Keep reading and throwing away for the first (n - 1) '\n's
Read characters till next '\n' and accumulate them into line
return line

readline(): Reading one line at a time in C

附:下面是一个shell解决方案,可以用来对C程序进行单元测试。

// Display 42nd line of file foo
$ head --lines 42 foo | tail -1
// (head displays lines 1-42, and tail displays the last of them)

【讨论】:

  • 我本来打算采用方法 2,但我相信你会同意它真的很乏味。感谢您的意见,有很多方法可以解决这个问题。
  • 是的,但问题定义令人困惑:-),我试图通过在问题的评论部分中询问来澄清,但我显然失败了!
【解决方案3】:

您可以使用附加值来帮助您记录已阅读的行数。然后在while循环中将该值与您的输入值进行比较,如果相等,则输出buffer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多