如何从文本文件中提取特定的编号行? (C)

时间:2013-04-23 03:43:05

标签: c string file

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

1 hello1 one
2 hello2 two
3 hello3 three

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

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

我想首先是第一件事,我需要在文件中找到字符'number'。那又怎样?如何在不包括号码的情况下编写该线路?我怎么能找到'号码'?我相信这很简单,但我不知道该怎么做。以下是我到目前为止的情况:

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 个答案:

答案 0 :(得分:2)

从你所说的你正在寻找在行的开头用数字标记的行。在这种情况下,您需要一些可以读取带有标记前缀

的行的内容
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");
}

答案 1 :(得分:1)

我会尝试以下方法。

方法1:

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

方法2:

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

P.S。以下是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 :(得分:0)

您可以使用其他值来帮助您记录已读取的行数。然后在while循环中将值与输入值进行比较,如果它们相等,则输出buffer。< / p>