【问题标题】:What is an update stream in C?什么是 C 中的更新流?
【发布时间】:2021-07-20 18:37:14
【问题描述】:

在 n1256 7.19.5.2 第 2 段(用我的粗体字):

如果流指向输出流或更新流,其中最近的 未输入操作,fflush 函数会导致该流的任何未写入数据 被交付到宿主环境中写入文件;否则,行为是 未定义。

如果没有“更新流”这个词,那么整个段落都是有意义的。但我不知道它是什么。标准本身并没有介绍它。谷歌搜索似乎不起作用。这是什么意思?

【问题讨论】:

  • 更新流意味着你可以对其进行输入和输出。
  • 可能以+ 模式打开的流,N1256 将其描述为“用于更新”?
  • @MikeCAT N1256 有很多版本吗?我不知道。这是我的N1256
  • @opol 我看的是7.19.5.3文件的fopen函数。

标签: c stream language-lawyer


【解决方案1】:

术语“更新流”仅表示可读写的流。

这在 §7.19.5.3 第 3 点中指定(link,粗体字):

#include <stdio.h>
FILE *fopen(const char * restrict filename,const char * restrict mode);

[...]

参数模式指向一个字符串。如果字符串是以下之一,则文件以指示的模式打开。否则,行为未定义(237)

  • r:打开文本文件进行阅读
  • w: 截断到零长度或创建文本文件进行写入
  • a:追加;打开或创建文本文件以在文件末尾写入
  • rb:打开二进制文件进行读取
  • wb: 截断到零长度或创建二进制文件进行写入
  • ab:追加;打开或创建二进制文件以在文件末尾写入
  • r+:打开文本文件以进行更新(读写)
  • w+: 截断到零长度或为更新创建文本文件
  • a+:追加;为更新打开或创建文本文件,写入文件末尾(237)
  • r+brb+:打开二进制文件进行更新(读写)
  • w+bwb+:截断到零长度或创建二进制文件以进行 更新
  • a+bab+:追加;为更新打开或创建二进制文件,在文件末尾写入

(237) 如果字符串以上述序列之一开头,则实现可能会选择忽略剩余的字符,或者它可能会使用它们来选择不同类型的文件(其中一些可能不符合 7.19.2 中的属性)。

【讨论】:

    【解决方案2】:

    在此上下文中,术语“更新”是指为读取和写入而打开的文件。

    该术语用于C99 standard 的第 7.19.5.3 节中的 fopen 函数规范中:

    3 参数mode 指向一个字符串。如果该字符串是以下之一,则文件在指定的位置打开 模式。否则,行为未定义。

    r打开文本文件进行阅读

    w 将长度截断为零或创建文本文件以供写入

    a 附加;打开或创建文本文件以在文件末尾写入

    rb打开二进制文件进行读取

    wb截断为零长度或创建二进制文件进行写入

    ab 附加;打开或创建二进制文件以在文件末尾写入

    r+打开文本文件进行更新(读写)

    w+ 截断为零长度或创建文本文件进行更新

    a+ 附加;打开或创建文本文件进行更新,在文件末尾写入

    r+brb+ 打开二进制文件进行更新(读写)

    w+bwb+ 截断为零长度或创建二进制文件以进行更新

    a+bab+ 附加;打开或创建二进制文件进行更新,在文件末尾写入

    ...

    6 当文件以更新模式打开时('+' 作为上述mode 参数值列表中的第二个或第三个字符),输入和输出都可以在关联的流。但是,如果没有对fflush 函数或文件定位函数(fseekfsetposrewind)的干预调用,则输出不应直接跟在输入之后,并且输入不应直接跟在输出之后没有对文件定位函数的干预调用,除非输入操作遇到文件结尾。在某些实现中,使用更新模式打开(或创建)文本文件可能会打开(或创建)二进制流

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多