c++ 在文档/规范中,它描述了如何在文本模式下将'\n'转换为特定于平台的行结尾?

jljoyd4f  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(116)

根据经验,我知道下面的代码:

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    return 0;
}

导致在不同的平台上打印不同的行结束(例如,Linux:LF,Windows:CRLF),如果我想要特定的行为,有时我必须使用switch count to binary mode。同样地,我知道对于我自己打开的文件流,我必须小心地为我想要的行结束行为指定文本或二进制模式。
然而,我正在努力寻找将\n转换为CRLF的行为实际上是文档
我查阅了C规范(特别是C98到22)和各种在线参考资料(例如:cppreference.com),并且找不到哪个类/库例程负责 * 实际将\n转换为特定于平台的行end`。(另外,不要问ChaptGPT,它很乐意从不存在的规范中引用)
或者换个说法:C++的文本模式和二进制模式流的行为在哪里指定?
如果在C++规范中找不到它,那么问题是:它是从C继承的行为吗?如果是,在哪里定义?
或者这是C从它运行的平台上继承的东西?

ivqmmu1c

ivqmmu1c1#

从C标准7.21.2 Streams中,重点是:
文本流是组成行的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符由实现定义。**在输入和输出时可能需要添加、更改或删除字符,以符合主机环境中表示文本的不同约定。**因此,流中的字符与外部表示中的字符之间不需要一一对应。只有在以下情况下,从文本流中读入的数据才必须与先前写出到该流的数据进行比较:数据仅由打印字符和控制字符水平制表符和换行组成;没有空格字符紧接在换行符之前;最后一个字符是换行符。在读入时,在换行字符出现之前立即写出的空格字符是否由实现定义。
二进制流是可以透明地记录内部数据的有序字符序列。从二进制流中读取的数据应与之前写入该流的数据进行比较,在相同的实现下。但是,这样的流可能会在流的末尾附加实现定义的空字符数。
C基本上继承了这个定义。
关于您的问题的编辑:
如果找不到文档,那么替代答案是知道在C
stdlib、C stdlib或各种操作系统平台中哪个特定的API可以做到这一点。
您正在寻找的“API”是 * 以文本模式打开流 *。
您编写printf( "Hello Bob!\n" )std::cout << "Hello Bob!\n",库实现将执行任何必要的转换(可能不限于行结束)。

相关问题