2013-03-05 38 views
5

它是一个微软面试问题。用C文件如何从文件中读取最后n行C

阅读最后N行(精确)

那么可能有这么多的方式来实现这一目标,他们几个人可能是:

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

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

- >实施排序尾-n FNAME的东西

- >为了更加优化它我们可具有长度n和动态存储在循环方式,直到我们达到结束每一行双指针的文件。

例如,如果文件中有10行并且想要读取最后3行。那么我们可以创建一个buf [3] []缓冲区数组,并且在运行时将继续使用mallocing并以循环方式释放缓冲区,直到到达最后一行并保留一个计数器以知道当前数组的索引。

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

+0

最后一个似乎更优化。 – 2013-03-05 05:07:39

+0

看看尾部实施? HTTP://计算器。com/questions/10164597/how-will-you-implement-tail-effective – StarPinkER 2013-03-05 05:47:50

+1

对于额外的点,如果文件少于n行,则返回错误。 – 2013-03-05 10:35:45

回答

8

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

另一种方法是从文件末尾读取1024个字节的块。停止当您发现n\n字符并打印出最后n行。

+0

+1优雅的解决方案:) – 2013-03-05 05:08:58

+2

如果每条线都是500字节,那么管理缓冲区加入将会很痛苦。 – Anshul 2013-03-05 05:13:53

+1

@ansh,在这种情况下,向后启动可能仍然有意义,但由于您可能会丢弃数千兆字节的数据直到最后n行,并且您可能不想缓冲数据,但只需找到偏移量 – perreal 2013-03-05 05:16:37

4

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

继续增加第一个指针,直到找到'\ n'字符时,它还会在找到'\ n'时存储文件指针的实例。

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

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

所以这是一次性打印最后n行文件的解决方案。

1

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