我正在尝试编写一个函数,根据给定的数字打印文本文件中的特定行。例如,假设该文件包含以下内容:
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);
}
}
非常感谢任何帮助。
答案 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>