如何fgets()C中文件的特定行?

gfp*_*ste 5 c fgets filestream

所以,我试图找到一种方法来fgets()C中的文本文件中的特定行,以将该行的内容复制到更永久的缓冲区:

基本上,我想知道是否有一种方法可以做到这一点,没有类似于以下代码:

FILE *fp;
fp = fopen(filename, "r");

char line[256];
char * buffer;
int targetline = 10;
while( targetline > 0)
{
    fgets(line, 256, fp)
}

buffer =(char*)malloc(sizeof(char) * strlen(line));
strcpy(buffer, line);
Run Code Online (Sandbox Code Playgroud)

所以基本上我不想遍历文件n-1次只是为了到达第n行...它只是看起来效率不高(而且,这是作业,我需要得到100%哈哈) .

任何帮助,将不胜感激.

Ant*_*ake 8

如果您知道每行的长度,可以使用fseek跳到所需的行.

否则,你需要经历所有行.


Dav*_*nan 7

除非您了解有关该文件的更多信息,否则无法随机访问特定行.新行由行末字符的存在分隔,并且它们通常可以在任何地方出现.文本文件不拿出一个地图或指标,它会让你跳过到第n 个行.

如果您知道,例如,文件中的每一行都是相同的长度,那么您可以使用随机访问来跳转到特定的行.如果没有这种类型的额外知识,你就别无选择,只能遍历整个文件,直到达到所需的行.


Kei*_*son 5

首先,你的线

buffer =(char*)malloc(sizeof(char) * strlen(line));
Run Code Online (Sandbox Code Playgroud)

写得更好:

buffer = malloc(strlen(line) + 1);
Run Code Online (Sandbox Code Playgroud)

的+ 1需要,以提供空间用于终止" \0"字符; strlen()没有考虑到这一点.malloc()不需要在C中转换结果,并且在某些情况下可以掩盖错误. sizeof(char)根据定义是1,所以不需要.

并且你永远不会改变它的值targetline,所以你的循环永远不会终止.

但是在回答你的问题时,如果你有一个文本文件并且想要读取它的第N行,你必须阅读并跳过前面的第一行N-1行.(可以设置一个单独的索引,但是创建索引需要通过文件读取,并且在文件更改时保持索引最新是一个难题,可能超出了您现在正在做的事情.并且它并不是特别必要;从文件中读取10行的时间不会很明显.)