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

时间:2011-11-17 22:14:38

标签: c filestream fgets

所以,我正在尝试找到一种方法来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);

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

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:8)

如果你知道每一行的长度,你可以使用fseek跳到你想要的行。

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

答案 1 :(得分:7)

除非您了解有关该文件的更多信息,否则无法随机访问特定行。新行由行末字符的存在分隔,并且它们通常可以在任何地方出现。文本文件没有 map index ,可以跳到n th 行。

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

答案 2 :(得分:5)

首先,你的行

buffer =(char*)malloc(sizeof(char) * strlen(line));

最好写成:

buffer = malloc(strlen(line) + 1);

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

你永远不会改变targetline的值,所以你的循环永远不会终止。

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

答案 3 :(得分:3)

我担心,没有其他方法可以在文件中获得第n行。你必须经历。文件中没有随机访问。

答案 4 :(得分:2)

如果要从文本文件中获取第n行,则必须先读取n-1行。这是顺序文件的本质。除非你知道你的所有行都是相同的长度,否则无法可靠地定位到特定行的开头。