`fseek`、`lseek`、`seekg` 和 `seekp` 有何区别?(涉及 IT 技术)

28
我被面试官问到如何实现Linux shell中的tail命令。我的回答是,首先将文件指针定位到文件末尾,然后逐个向前读取字符,如果遇到\n,则表示一行结束,之后继续向前读取,如此循环。我认为我的回答是正确的。
然后我遇到了这个问题:应该使用哪种方式来实现tail命令的文件指针定位?我以为可以简单地使用seekg(C++语言的函数?),但是有人告诉我应该使用lseek(Linux系统调用?)。
包括fseek(ANSI C的函数?)在内,我应该使用哪种方式来实现tail命令?它们之间有什么重大区别吗?

3
相信在Linux系统中,fseek只是对lseek的一个封装。 - James M
@JamesMcLaughlin,我期望如此。 - Alcott
1个回答

25

当使用C ++ IOstreams库时,请使用seekg。这里不使用seekp,因为它设置了输出指针。

当使用C stdio库时,请使用fseek。当使用低级POSIX文件描述符I / O时,请使用lseek

各种寻址功能之间的区别仅在于它们操作的文件/流对象的类型。在Linux上,seekgfseek可能是基于lseek实现的。


那么,我可以在C中使用fseek或在C++中使用seekg成功地实现“tail”吗? - Alcott
@Alcott:是的。seekg/IOstreams 是C++的“本地”I/O库,但 stdio 可能更快。由你决定。 - Fred Foo
1
不,你应该选择fseek,因为它适用于标准I/O,易于使用、可移植且带缓冲。而lseek则适用于低级别的I/O操作。 - Fred Foo
@R..,lseek没有缓冲吗?那么这是否意味着我应该在代码中自己进行缓冲? - Alcott
@Alcott:如果你想使用lseek并且需要缓冲,那么是的,你需要自己处理。 - Fred Foo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接