0

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

1 hello1 one
2 hello2 two
3 hello3 three

如果给定的数字是“3”,该函数将输出“hello3 3”。如果给定的数字是“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);
    }
}

任何帮助都将不胜感激。

4

3 回答 3

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");
}
于 2013-04-23T04:02:43.700 回答
1

我会尝试以下。

方法一:

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():在 C 中一次读取一行

PS 以下是一个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)
于 2013-04-23T04:04:03.380 回答
0

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

于 2013-04-23T03:58:17.893 回答