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

问题描述 投票:0回答:1

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

#include <iostream>

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

导致在不同的平台上打印不同的行尾(例如 Linux:LF,Windows:CRLF),如果我想要特定的行为,我有时不得不 switch count to binary mode。同样,我知道使用文件流我自己打开我必须小心地为我想要的行结束行为指定文本或二进制模式。

但是我正在努力寻找这种转换行为的位置 到 CRLF 实际上是记录

我查看了 C++ 规范(特别是 C++98 到 22)和各种在线参考资料(例如 cppreference.com),但找不到哪个类/库例程负责*实际转换

\n
进入平台特定的行结束。 (另外,不要问 ChaptGPT,它很乐意从不存在的规范中引用)

或者换句话说:C++ 的文本模式和二进制模式流的行为在哪里指定?

(我假设这是一个隐含地推迟到平台的 C 标准库在这个问题上的行为的情况?)

如果找不到文档,那么替代答案将是了解在 C++ stdlib、C stdlib 或各种操作系统平台中哪个特定的 API 执行此操作。

c++ language-lawyer newline std line-endings
1个回答
3
投票

来自 C 标准,7.21.2 Streams,强调我的:

文本流是组成行的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。 可能必须在输入和输出中添加、更改或删除字符,以符合在主机环境中表示文本的不同约定。 因此,流中的字符之间不需要一一对应和那些在外部代表。只有在以下情况下,从文本流中读入的数据必然与早先写出到该流中的数据比较相等:没有换行符紧跟空格字符;最后一个字符是换行符。 读入时在换行符出现之前写出的空格字符是否是实现定义的。

二进制流是一种有序的字符序列,可以透明地记录内部数据。从二进制流中读入的数据应与先前写入该流的数据比较,在相同的实现下然而,这样的流可能有一个实现定义的空字符数附加到流的末尾。

C++基本继承了这个定义

参考您问题的编辑:

如果找不到文档,那么替代答案将是了解在 C++ stdlib、C stdlib 或各种操作系统平台中哪个特定的 API 执行此操作。

您正在寻找的“API”是以文本模式打开流.

你写

printf( "Hello Bob!\n" )
std::cout << "Hello Bob!\n"
,库实现会做任何必要的转换(可能不限于行尾)。

© www.soinside.com 2019 - 2024. All rights reserved.