gpt4 book ai didi

c - fgetpos() 和 fsetpos() 是否仅适用于文本模式?如果不是字节数,fpos_t 对象填充了哪些位置/偏移数据?

转载 作者:行者123 更新时间:2023-12-04 11:51:32 25 4
gpt4 key购买 nike

我了解 ftell() 和 fseek() 在 C 中的工作原理,但是对于这个问题,我在任何地方都找不到任何准确的答案,包括 StackOverflow 上最近的帖子(LINK)。

那么请您回答以下问题:

  • 是否可以断定 fgetpos() 和 fsetpos() 只与以文本模式打开的文本文件相关,而与以二进制模式打开的文件无关?
  • fgetpos() 填充的 fpos_t 对象是什么类型的位置信息,假设它不是一个长整数偏移量等,就像 ftell() 给出的那样? cplusplusreference 网站仅提供以下信息:

The function fills the fpos_t object pointed by pos with the information needed from the stream's position indicator to restore the stream to its current position

最佳答案

fgetpos()fsetpos()与文本和二进制模式相关。

fgetpos() 的优点是保留了流中的完整位置,包括其内部的状态,以便以后可以恢复。无论您是否处于文本模式,这都有效。如果您使用 wide oriented streams,这一点尤其重要。或混合 fgetc()fgetwc()在同一个文件中,因为某些语言环境使用状态相关的多字节编码(状态取决于先前的读取)。

fseek() ftell() 也可以使用文本和二进制模式。然而,文本模式有一个重要的限制:你应该只使用 fseek() 和 0 或以前由 ftell() 返回的值(在二进制模式下你可以使用任何你想要的值(value))。这是因为文本模式读取可以改变读取返回的字节数与文件中的有效字节数相比(典型示例,Windows 文件中的 2 个 CR+LF 字节被转换为一个符号 LF 字节)。

由于 ftell() 只返回一个 long int 偏移量,因此如果需要,它无法跟踪多字节状态。所以使用 fseek() 可能会失去这种状态。

关于c - fgetpos() 和 fsetpos() 是否仅适用于文本模式?如果不是字节数,fpos_t 对象填充了哪些位置/偏移数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com