【问题标题】:C fopen mode parameterC fopen 模式参数
【发布时间】:2013-09-25 08:04:53
【问题描述】:

为什么 C 中 fopen 的“模式”参数由字符串给出?将它作为位掩码或类似的东西会更有意义(以我的思维方式)。字符串所需的开销是低效且不必要的。

【问题讨论】:

  • 您的程序是否曾因解析属性字符串而遭遇严重瓶颈?
  • 与打开文件本身相比,我怀疑解析那个小字符串的开销相形见绌。
  • 有效积分,但其背后的原因仍未得到解答。除此之外,如果您创建了函数,您是否愿意解析模式字符串参数?我很好奇为什么。
  • @Dayalrai, fopen(f, "wb") 并不比 fopen(f, FILE_WRITE | FILE_BINARY) 更易读,他的问题对我来说很有意义。
  • A closely related question 询问为什么不使用enum;答案是fopen 早于enum。 K&R1 (1978) 中fopen 的示例实现只查看模式字符串的第一个字符,可以是'r''w''a'

标签: c file fopen


【解决方案1】:

C11 §7.21.5.3 fopen 函数

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

在脚注中:

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

根据 C99 基本原理,委员会认为实现可以选择使用 mode 而非标志:

Rationale for International Standard — Programming Languages — C §7.19.5.3 fopen 函数

实现可以选择允许附加文件规范作为模式字符串参数的一部分。例如,

file1 = fopen(file1name, "wb,reclen=80");

在提供面向记录的二进制文件并允许程序员指定记录长度的系统上可能是一个合理的扩展。

GNU libc 有一个扩展,允许mode 包含ccs=STRING,请参阅glibc manual

【讨论】:

    【解决方案2】:

    如果它是一个位掩码,它将更多地限于未来的扩展。 GNU C 库已经允许 10 种不同的模式和 MSVC 15。此外,它们支持 ,ccs=string 语法,而这在位掩码中是不可能的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多