提问人:Pod 提问时间:5/15/2023 最后编辑:Pod 更新时间:8/14/2023 访问量:100
在文档/规范中,它描述了如何在文本模式下将“\n”转换为特定于平台的行尾?
Where in the documentation/spec does it describe how '\n' is converted in text-mode to platform-specific line-endings?
问:
根据经验,我知道以下代码:
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
导致在不同的平台(例如 Linux:LF、Windows:CRLF)上打印不同的行尾,如果我想要特定行为,我有时必须将计数切换到二进制模式。同样,我知道,对于我自己打开的文件流,我必须小心地为我想要的行结束行为指定文本或二进制模式。
但是,我正在努力找到这种将 \n 转换为 CRLF 的行为实际上在哪里被记录下来!
我查看了C++规范(特别是 C++98 到 22)和各种在线参考(例如 cppreference.com),但找不到哪个类/库例程负责*实际将 转换为特定于平台的行尾'。(另外,不要问 ChaptGPT,它很高兴地从规范中编造不存在的引号)\n
或者换一种说法:C++ 的文本模式和二进制模式流的行为在哪里指定?
如果在C++规范中找不到它,那么问题是:它是从C继承的行为吗?如果是这样,它在哪里定义?
或者这是 C 从它运行的平台上继承的东西?
答:
来自 C 标准,7.21.2 Streams,强调我的:
文本流是组成行的有序字符序列,每行由零个或多个字符以及一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。可能需要在输入和输出上添加、更改或删除字符,以符合在宿主环境中表示文本的不同约定。 因此,流中的字符与外部表示中的字符之间不需要一对一的对应关系。只有在以下情况下,从文本流中读入的数据才能与之前写出到该流的数据进行比较:数据仅由打印字符和控制字符水平制表符和换行符组成;换行符前面没有空格字符;最后一个字符是换行符。 读入时,在换行符之前写出的空格字符是否由实现定义。
二进制流是可以透明地记录内部数据的有序字符序列。在相同的实现下,从二进制流读入的数据应与之前写入该流的数据相等。但是,这样的流可能具有实现定义的 null 字符数,这些 null 字符附加到流的末尾。
C++基本上继承了这个定义。
参考您的问题的编辑:
如果找不到文档,那么替代答案是了解哪个特定 API 在 C++ stdlib、C stdlib 或各种操作系统平台中执行此操作。
您正在寻找的“API”是以文本模式打开流。
您编写 或 ,库实现将执行任何必要的转换(可能不限于行尾)。printf( "Hello Bob!\n" )
std::cout << "Hello Bob!\n"
评论
\n
评论
'\n'