Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中读取文件的最后n行_C_Algorithm_Data Structures - Fatal编程技术网

如何在C语言中读取文件的最后n行

如何在C语言中读取文件的最后n行,c,algorithm,data-structures,C,Algorithm,Data Structures,这是微软的面试问题 使用C读取文件的最后n行(精确) 实现这一目标的方法有很多,但很少有: ->最简单的是,在第一遍中,计算文件中的行数,在第二遍中显示最后n行 ->或者可以为每一行维护一个双链接列表,并通过反向遍历linkedlist直到第n个最后节点来显示最后n行 ->实现某种类型的tail-nfname ->为了进一步优化它,我们可以使用长度为n的双指针,并以循环方式动态存储每一行,直到到达文件末尾 例如,如果文件中有10行,并且希望读取最后3行。然后,我们可以创建一个buf[3][]形式

这是微软的面试问题

使用C读取文件的最后n行(精确)

实现这一目标的方法有很多,但很少有:

->最简单的是,在第一遍中,计算文件中的行数,在第二遍中显示最后n行

->或者可以为每一行维护一个双链接列表,并通过反向遍历linkedlist直到第n个最后节点来显示最后n行

->实现某种类型的tail-nfname

->为了进一步优化它,我们可以使用长度为n的双指针,并以循环方式动态存储每一行,直到到达文件末尾

例如,如果文件中有10行,并且希望读取最后3行。然后,我们可以创建一个buf[3][]形式的缓冲区数组,在运行时,我们将以循环方式不断地删除和释放缓冲区,直到到达最后一行,并保留一个计数器以了解数组的当前索引


如果上述任何一种方法可以帮助我获得正确答案或任何其他此类问题的流行方法,请任何人帮助我提供更优化的解决方案或至少指导我。

您可以使用队列并存储此队列中最后n行。当您看到eof时,只需打印队列


另一种方法是从文件的末尾到开头读取1024字节的块。找到
n
\n
字符时停止,并打印出最后的
n
行。

您可以有两个文件指针最初指向文件的开头

继续递增第一个指针,直到它找到“\n”字符,并且在它找到“\n”时还存储文件指针的实例

一旦找到第(n+1)个'\n',将先前保存的文件指针的第一个存储实例分配给第二个文件指针。继续执行相同操作,直到EOF

所以,当第一个文件指针位于EOF上时,第二个将位于n'\n'后面。然后将第二个文件指针中的所有字符打印到EOF


所以,这是一个解决方案,它可以在一次过程中打印文件中的最后n行。

使用内存映射文件并从后面扫描文件如何?这消除了每次当行恰好超过缓冲区空间时更新缓冲区窗口的困难工作。然后,当您找到
\n
时,将该位置推入堆栈。这适用于
O(L)
,其中L是要输出的字符数。所以没有什么比这更好的了,是吗?

最后一个似乎更优化了。看看tail实现?对于额外的点,如果文件少于n行,则返回一个错误。如果每行都是500字节,那么管理缓冲区连接将是一件非常痛苦的事情。@ansh,对,在这种情况下,向后开始可能仍然有意义,因为您可能会丢弃长达最后n行的千兆字节数据,并且您可能不想缓冲数据,而只是定位偏移量创建偏移量是我的想法。。。perreal的想法可能有效如果行很长,只需将缓冲区与指向缓冲区中第一个完整行开始的指针一起推到堆栈上即可。然后从该位置开始读取另一个块减去缓冲区大小。基本上,读取重叠缓冲区。不需要麻烦加入缓冲区。或者,更好的方法是读取64K缓冲区。您可能仍然需要处理长线,但这将是非常罕见的。我想知道如何使用fseek,我发现没有人提到它。fseek在找到EOF之前是否必须解析整个文件?