用不好seek_set怎么办?大神分享实用技巧!

吉云

得,今天就来聊聊我捣鼓那个 seek_set 的事儿。这玩意儿,说白就是跟文件打交道时候,用来定位的一个参数。

是这么回事儿,前段时间我在弄一个数据处理的小工具,需要读取一个挺大的日志文件,但又不是从头到尾读,得跳来跳去的,找特定的数据块。我就直接用读取函数,想着读一段,跳过一段。结果发现效率奇低,文件一大,那等待时间简直让人抓狂。

后来就琢磨,这肯定有直接跳到指定位置的方法?翻翻手册,找到一个叫 `fseek` 的函数,看着就像是干这个的。这函数有三个参数,一个是文件指针,一个是偏移量,一个就是决定怎么跳的关键。

用不好seek_set怎么办?大神分享实用技巧!

这一个参数,就有好几个选项,什么 `SEEK_CUR`、`SEEK_END`,还有就是今天说的这个 seek_set。当时我就有点懵,这几个都是啥意思?

  • SEEK_CUR:看着像是从当前位置开始算。
  • SEEK_END:那估计就是从文件末尾开始算?这个感觉有点怪,通常不都是往前跳吗?
  • seek_set:这个 `set`,感觉像是“设置”?设置到哪儿?

用不好seek_set怎么办?大神分享实用技巧!

我就开始试。先随便写个偏移量,比如 100,然后用 seek_set。一运行,发现文件指针果然跑到离文件开头 100 个字节的地方。,seek_set 原来是这个意思,就是不管你现在指针在哪儿,都给我从文件的最最开始算起,然后往后挪指定的字节数。这就很清晰,定位特别准。

捣鼓过程中的小插曲

刚开始理解不透彻的时候,我还真闹点笑话。我试过用 seek_set 配合一个负数的偏移量,想着是不是能从文件开头往前“回退”。结果程序直接报错或者行为异常。后来才反应过来,seek_set 是从文件头开始的绝对位置,你给个负数,它去哪儿找?文件开头就是 0 位置,没法再往前。这跟那个 `SEEK_CUR`(从当前位置算)或者 `SEEK_END`(从文件尾算)可以接受负数偏移(往前跳)完全不一样。

还有就是,用 seek_set 的时候,那个偏移量 `offset` 必须是个正数或者零。如果是零,那 `fseek(fp, 0, SEEK_SET);` 就相当于把文件指针直接扔回文件的最开头,这在需要重新从头读取文件内容的时候特别方便,省得先关文件再重新打开。

简单总结下我的实践经验:

    用不好seek_set怎么办?大神分享实用技巧!

  • 想从文件绝对的开头算起,跳到某个精确的位置,就用 seek_set
  • 偏移量 `offset` 一般得是大于等于零的整数。
  • fseek(文件指针, 0, SEEK_SET) 可以快速回到文件开头

基本上就是这样。搞清楚 seek_set 之后,我那个数据处理工具的效率立马就上来,再也不用傻乎乎地一点点读或者跳过数据,直接 `fseek` 一下,指哪儿打哪儿,舒服多。这玩意儿,看着不起眼,用对地方是真能解决大问题。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]