【问题标题】:When will puts() fail?puts() 什么时候会失败?
【发布时间】:2016-05-12 22:44:51
【问题描述】:

对于puts (const char*),我读到“成功时返回非负值。出错时,函数返回 EOF 并设置错误指示符 (ferror)。”

我试图让函数出错,所以我可以cout EOF 返回,但我似乎做不到。如果我没有将 char* 初始化为任何值,或者将其设置为 NULL,它仍然返回一个非负的成功值。是什么实际上会使此功能失败?谢谢。

附带问题:如果您 cout << 一个应该返回 EOF 的函数,它实际上会打印 'EOF'、其他内容还是什么都不打印?这实际上是我最初尝试测试的。

【问题讨论】:

  • 一个明显的可能性是尝试写入已满的磁盘(并且没有回写缓存)。
  • 哦,我没想到。我可以更轻松地测试任何其他可能性吗?
  • 你可以关闭stdout
  • @KerrekSB:不过那将是 UB。指向FILE 对象的指针的值在关闭后是不确定的。
  • @Jake:回答你的附带问题,如果你cout << EOF << endl;它只会打印一个负数,例如-1。返回 EOF 的函数通常具有返回类型 int,因此它只是为 int 调用 << 重载。

标签: c++ puts


【解决方案1】:

如果您使用的是支持它的系统(例如,Linux),您可以将程序的输出重定向到/dev/full,该设备会在输入时产生无限的零字节流并失败并显示ENOSPC ("设备上没有剩余空间") 输出。

./program > /dev/full

当然,您必须将任何错误消息打印到stderr(或std::cerr)或文件中。

【讨论】:

    【解决方案2】:

    很遗憾,这不起作用。 Linux 管道,除了“stderror”被缓冲。使用上面的示例,“puts”不会给出错误消息 (-1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多