【发布时间】:2019-01-07 01:10:24
【问题描述】:
我的课本上说:
“如果没有对 fflush、fseek、fsetpos 或 rewind 的介入调用,输入函数不能跟随输出函数,反之亦然 流 I/O 的第一个限制可以通过采用在每次输入操作之前刷新缓冲区的规则来解决。但是,解决第二个限制的唯一方法是在同一个打开的套接字描述符上打开两个流,一个用于读取,一个用于写入。”
所以我的问题是:
- 为什么输入函数不能跟随输出函数,反之亦然?
- 为什么不能通过添加 fflush 操作来修复第二个限制?
【问题讨论】:
-
如果在同一个流上进行读写操作,必须确保操作彼此一致(例如,在写入流后,确保从该流的下一次读取从您期望的位置开始它到)。调用
fflush()等是确保一致性的手段。但是,该描述似乎特定于特定操作系统。也就是说,通常有比在单个流上交错读取和写入更好的选择。 -
fflush仅对未输入最后操作的输出流或混合模式流定义了行为;否则它的行为是不确定的。 -
@Peter:描述直接参考C标准。特定的操作系统可能有宽松的条件(例如,Linux 在输入上定义
fflush(),或者某些操作系统/库完全消除了这些限制)。但是一个完全符合标准的程序可能不依赖它,因为它是不可移植的。 -
@DevSolar - OP 引用的描述描述了在同一个打开的套接字描述符上打开两个流的“第二个限制”的解决方法。那不是标准的 C。