这是一个微软的面试问题。
使用C(精确)
读取最后n行文件
那么可能有很多方法可以实现这一目标,其中很少可能是:
- >最简单的是,在第一遍中,计算文件中的行数,在第二遍中显示最后n行。
- >或者可以为每一行维护一个双向链表,并通过返回遍历链表到最后一个节点显示最后n行。
- >实现tail -n fname
的排序- >为了更好地优化它,我们可以使用长度为n的双指针,并且每行以循环方式动态存储,直到我们到达文件末尾。
例如,如果文件中有10行并且想要读取最后3行。然后我们可以创建一个缓冲区数组作为buf [3] []并在运行时继续mallocing并以循环方式释放缓冲区,直到我们到达最后一行并保持计数器以知道当前的数组索引。
任何人都可以帮助我提供更优化的解决方案或至少指导我,如果上述任何一种方法可以帮助我得到正确的答案或任何其他流行的方法/方法来解决这类问题。
答案 0 :(得分:8)
您可以使用队列并存储此队列中显示的最后n行。当你看到eof只是打印队列。
另一种方法是从文件末尾开始读取1024字节的块。当您找到n
\n
个字符并打印出最后n
行时停止。
答案 1 :(得分:4)
您最初可以指向文件开头的两个文件指针。
继续递增第一个指针,直到找到'\ n'字符,当找到'\ n'时,它还存储文件指针的实例。
找到(n + 1)th'\ n'后,将我们先前保存的文件指针的第一个存储实例分配给第二个文件指针。保持相同直到EOF。
因此,当第一个文件指针在EOF上时,第二个将在n'\ n'后面。然后将第二个文件指针中的所有字符打印到EOF。
所以这是一个解决方案,可以在单个传递中打印文件中的最后n行。
答案 2 :(得分:1)
如何使用内存映射文件并从后向扫描文件?如果线路恰好比缓冲区空间长,那么每次都会消除更新缓冲区窗口的繁重工作。然后,当您找到\n
时,将位置推入堆栈。这适用于O(L)
,其中L是要输出的字符数。所以没有比这更好的了吗?