【问题标题】:what's the difference between `fseek`, `lseek`, `seekg`, `seekp`?`fseek`、`lseek`、`seekg`、`seekp` 之间有什么区别?
【发布时间】:2012-03-10 02:31:45
【问题描述】:

一位面试官问我如何实现tail(是的,Linux shell 中的那个)。我的回答是,先寻找到文件的末尾,然后一个接一个地向前读取字符,如果遇到\n,则表示一行已关闭,等等。我认为我的答案是正确的。

然后我发现了这个问题,我应该用哪个seek来实现tail?我以为我可以简单地使用seekg(C++ 的东西?),但有人告诉我应该使用lseek(Linux 系统调用?)。

所以包括fseek(ANSI C 的东西?),我应该使用哪一个来实现tail? 它们之间有什么大的区别吗?

【问题讨论】:

  • 相当肯定 fseek 只是 Linux 上 lseek 的包装器。
  • @JamesMcLaughlin,我希望如此。

标签: c++ c file-io


【解决方案1】:

使用 C++ IOstreams 库时使用 seekgseekp 在这里没有用,因为它设置了 put 指针。

使用 C 标准输出库时使用 fseek。使用低级 POSIX 文件描述符 I/O 时使用 lseek

各种查找函数之间的区别只是它们操作的文件/流对象的类型。在 Linux 上,seekgfseek 可能是按照 lseek 来实现的。

【讨论】:

  • 那么,我可以在C 中使用fseek 或在C++ 中使用seekg 成功实现'tail`,对吧?
  • @Alcott:是的。 seekg/IOstreams 是 C++“本机”I/O 库,但 stdio 可能更快。您的选择。
  • 我使用的是 linux,所以我应该选择lseek 而不是fseek
  • 不,你应该选择fseek,因为它可以与易于使用、便携和缓冲的stdio一起使用。 lseek 用于低级 I/O。
  • 对于许多标准实用程序,stdio 是不可接受的,因为它的缓冲可能会消耗额外的不可搜索输入字节,该实用程序被指定为在下一个调用的实用程序中保留未使用的输入(在 shell 脚本中)有权访问。因此lseek/read/等。一般优先于fseek/fread/等。但是,在 tail 的特定情况下,我怀疑这并不重要。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多