C++标准是否允许通过stdin/stdout读写任意二进制数据?

3
我仍然对C++17标准中有关从标准输入和输出中读取和写入的内容存在困惑。
如果程序通过标准输入接受任意二进制数据或将任意二进制数据输出到标准输出,是否会导致未定义行为(尽管实际上许多程序都这样做)?

2
这些是许多问题,而不仅仅是一个。单独提出每个问题都是很好的问题。 - Cubic
C++标准的草案可供阅读。还有这个相当不错的参考网站 - Some programmer dude
如果问题比较多,我很抱歉。我觉得它们之间有相互关联,更适合作为一个问题提出。不过如果需要的话,我也可以分别提出这些问题。 - FreeLang
@FreeLang非常感谢您“做好功课”。如果您先自己阅读参考资料,然后提出具体、针对性的问题,以解决您不清楚的问题,那么您的问题将会得到更好的回应。目前,这里唯一真正的回答就是大段C++标准的复制粘贴。 - SergeyA
此外,请明确您感兴趣的语言标准。我怀疑有人会为了回答这样的问题而考虑所有标准。 - Swordfish
我已经编辑了问题,使其更加专注于一个问题。如果有需要改进,请告知。 - FreeLang
2个回答

2

stdio 对于传输的数据完全中立。

如果不是这样,它会破坏像 I/O 重定向这样的东西。如果你不能通过 stdio 发送原始二进制数据,你就不能在 shell 管道中使用像 gzip 压缩器这样的插入工具。


2
C++ 实现在文本模式下打开 stdio(默认情况下)时,可以自由转换字符。我不知道重新以二进制模式打开它们的任何标准方法。 - FreeLang
4
不适用于 Windows。在文本模式下打开的文件中,\r\n 会被翻译成 \n,反之亦然。 - user1143634
这是因为在 POSIX 线程中,文件句柄的二进制读取和文本读取没有区别。 - L.C.
1
@FreeLang:你可以使用 _setmode 来改变翻译模式,_setmode(_fileno(stdin), _O_BINARY); 就可以解决问题。 - datenwolf
3
@datenwolf 这是一种非标准的黑客方式。我很感激你的努力,但这个问题是关于 C++标准 中对于接受和输出二进制数据是否属于未定义行为的规定,而不是某个特定实现所提供的内容。 - FreeLang

1
这个问题涉及标准,所以我认为给出this question的答案也适用于你的问题:
标准并不总是像我们希望的那样连贯,因为它是一个非常庞大的文档,由许多不同的人编写(实际上),尽管有所有校对。
正如相同的答案建议的那样,很难说什么是格式错误的。
我的理解是标准只是没有明确说明,但有其他语言特性(如datenwolf所示的示例)表明它不是格式错误,无论它意味着什么:
STDIN和STDOUT是文件句柄的简单事实意味着它们可以在二进制模式下打开、读取/写入。

我也有同样的怀疑,但看到这里没有人能够确切地回答这个问题,真是令人悲哀。 - FreeLang
甘地曾说过:“不要让C++标准让你感到悲伤。” - L.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接