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

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

任何帮助,将不胜感激。

除非您对该文件有更多了解,否则无法随机访问特定行。 新行由行末字符的存在分隔,并且它们通常可以在任何地方出现。 文本文件没有附带允许您跳到第n行的地图索引

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

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

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

首先,你的线

 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行的时间不会很明显。)

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

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

Interesting Posts