- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 fopen 的 C 标准中,关于以更新模式打开的文件 (C11 7.21.5.3/7),输出后跟输入需要对 fflush 或文件定位函数(fseek、fsetpos 或 rewind)的中间调用。但是,不需要任何文件定位函数来执行有关输出缓冲区的任何操作。
POSIX 标准对 fopen 保持相同的要求和更新模式。与 C 标准一样,fsetpos不需要对输出缓冲区做任何事情。然而,fseek需要将缓冲区写入文件。
在 C 和 POSIX 的情况下,一个符合规范的实现似乎可以在调用 fsetpos 时随意丢弃写缓冲区,并且 C 似乎允许 fseek 做同样的事情。我的第一个问题是我是否遗漏了标准中的相关内容。这里的含义是,可移植应用程序必须调用 fflush(或在 POSIX 的情况下调用 fseek/rewind)以确保在从输出切换到输入之前实际写入缓冲输出。
显然,丢弃写入缓冲区违背了所有写入函数的意图,而且我不知道有任何执行此操作的实现或任何类似的违反直觉的操作。我也知道我的知识有限,所以我的第二个问题是是否有任何符合规范的实现不能确保缓冲内容最终被写入正确的位置。
对于上下文,GNU 文档对 fopen 保持相同的要求和更新模式。对于 C 和 POSIX,fsetpos没有提到输出缓冲区,但我的测试表明我的版本确实刷新了缓冲区。然而,fseek可以刷新缓冲区或记住足够的信息以确保其内容最终得到正确写入。
TL;DR:C 或 POSIX 是否不允许 fsetpos 丢弃写入缓冲区?是否有执行此操作的实现?
编辑: 还没有人提供可靠的证据证明任一标准都禁止 fsetpos 丢弃写入缓冲区。同样,没有人提到执行此操作的任何实现。但是,C 标准(附件 J)中的可移植性问题列表中并未提及这一点,这表明这是一个疏忽,而不是一个模糊的可移植性问题。此外,正如 R.. 所提到的,没有禁止完全不相关的函数丢弃缓冲区。
最佳答案
我不明白你从哪里得到这个想法。 POSIX 比 C 标准更详细地介绍了缓冲行为,因为它必须处理 stdio FILE 流与访问相同文件的其他方式的交互。但是 C 标准中没有任何内容表明当您调用 fsetpos
时允许实现丢失输出。逻辑上数据已经写入。
此外,fsetpos
的规范(C11 7.21.9.3,¶2)如下:
If a read or write error occurs, the error indicator for the stream is set and fsetpos fails.
可能发生写入错误的唯一合理原因是某种写入操作,唯一合理的写入操作是刷新挂起的输出。
关于c - fseek/fsetpos 可能会丢弃流缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51469096/
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
在 fopen 的 C 标准中,关于以更新模式打开的文件 (C11 7.21.5.3/7),输出后跟输入需要对 fflush 或文件定位函数(fseek、fsetpos 或 rewind)的中间调用。
我的问题是我无法落后。两个函数似乎最让我困惑,如果可能是我忽略的一件小事,但从我的结果来看,我只是没有看到它。 还有其他和我类似的问题。 Jet 我选择提出这个问题是因为我认为这可能会导致其他两个问题
ftello/fseeko 和fgetpos/fsetpos 有什么区别?两者似乎都是文件指针获取/设置函数,它们使用不透明的偏移类型有时允许 64 位偏移。 它们是否受不同平台或不同标准的支持?它使
使用函数 fgetpos() 和 fsetpos() 与使用函数 ftell() 和 fseek 有什么区别() 获取和设置文件中的位置? fgetpos() 和 fsetpos() 有什么用?为什么
我了解 ftell() 和 fseek() 在 C 中的工作原理,但是对于这个问题,我在任何地方都找不到任何准确的答案,包括 StackOverflow 上最近的帖子(LINK)。 那么请您回答以下问
哈!!我该如何把整个事情放在一个清晰的问题中!!让我试试: 我知道使用fopen()打开的文件被缓冲到内存中。我们使用缓冲区来提高效率和方便性。在从文件读取期间,文件的内容首先被读取到缓冲区,然后我们
虽然我知道 fpos_t 是一种不透明类型,旨在由 fgetpos() 函数初始化,C99 rationale 的 §7.19.9.1|指出: fgetpos and fsetpos were add
我是一名优秀的程序员,十分优秀!