gpt4 book ai didi

c - fseek/fsetpos 可能会丢弃流缓冲区?

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:46 27 4
gpt4 key购买 nike

在 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/

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