什么是C中的更新流?
在 n1256 7.19.5.2 第 2 段(我的粗体):
如果 stream 指向一个输出流或一个更新流,其中最近的操作没有输入,则 fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。
如果没有“更新流”这个词,整个段落就有意义了。但我不知道它是什么。标准本身没有介绍它。谷歌搜索似乎不起作用。它的意义是什么?
回答
术语“更新流”仅表示可读和可写的流。
这在 §7.19.5.3 第 3 点(链接,粗体我的)中指定:
#include <stdio.h> FILE *fopen(const char * restrict filename,const char * restrict mode);[...]
参数 mode 指向一个字符串。如果字符串是以下之一,则文件以指定的模式打开。否则,行为未定义(237)。
r: 打开文本文件进行阅读w: 截断为零长度或创建用于写入的文本文件a:追加;打开或创建用于在文件末尾写入的文本文件rb: 打开二进制文件进行读取wb: 截断为零长度或创建用于写入的二进制文件ab:追加;打开或创建二进制文件以在文件末尾写入r+: 打开文本文件进行更新(读取和写入)w+: 截断为零长度或创建文本文件进行更新a+:追加;打开或创建用于更新的文本文件,在文件末尾写入(237)r+b或rb+:打开二进制文件进行更新(读取和写入)w+b或wb+:截断为零长度或创建二进制文件进行更新a+b或ab+:追加;打开或创建用于更新的二进制文件,在文件末尾写入(237)如果字符串以上述序列之一开头,则实现可能会选择忽略剩余的字符,或者可能使用它们来选择不同类型的文件(其中一些可能不符合 7.19.2 中的属性) )。
回答
在此上下文中,术语“更新”表示为读取和写入而打开的文件。
该术语用于C99 标准fopen第 7.19.5.3 节中的函数规范:
3参数
mode指向一个字符串。如果字符串是以下之一,则文件以指定的模式打开。否则,行为未定义。r打开文本文件进行阅读
w截断为零长度或创建用于写入的文本文件
一个附加;打开或创建用于在文件末尾写入的文本文件
rb打开二进制文件进行读取
wb截断为零长度或创建用于写入的二进制文件
ab追加;打开或创建二进制文件以在文件末尾写入
r+打开文本文件进行更新(读取和写入)
w+截断为零长度或创建文本文件进行更新
a+追加;打开或创建用于更新的文本文件,在文件末尾写入
r+b或rb+打开二进制文件进行更新(读取和写入)
w+b或wb+截断为零长度或创建二进制文件进行更新
a+b或ab+追加;打开或创建用于更新的二进制文件,在文件末尾写入
...
6当文件以更新模式打开时(“+”作为上述
mode参数值列表中的第二个或第三个字符),输入和输出都可以在关联的流上执行。但是,输出后面不应直接跟在输入之后,而没有对fflush函数或文件定位函数(fseek,fsetpos, 或rewind)的干预调用,并且输入不应在没有对文件定位函数的干预调用的情况下直接跟随输出,除非输入操作遇到文件尾。在某些实现中,使用更新模式打开(或创建)文本文件可能会打开(或创建)二进制流