【问题标题】:cout chr(10) adds a superfluous chr(13) before it [duplicate]cout chr(10) 在它之前添加了一个多余的 chr(13) [重复]
【发布时间】:2020-08-26 01:44:07
【问题描述】:

我有两个通过 iostream 进行通信的 c++ exe。第一个 exe 发送一个字符流(或字节),第二个截获并解码它们。

exe1.exe 发出字符:

void main()
{
    for (int i = 0; i < 256; ++i)
    cout << static_cast<char>(i);
}

exe2.exe 将它们带入:

void main()
{
    FILE* pipe = _popen("exe1.exe", "rb");
    while (!feof(pipe))
        cout << static_cast<int>(fgetc(pipe)) << endl;
    _pclose(pipe);
}

人们会期望按顺序接收 256 个值,如下所示: 0,1,2,3,4,5,6,7,8,9,10,11,12,13...

但是一个得到 0,1,2,3,4,5,6,7,8,9,13,10,11,12,13...

在 10 处有问题,您可以在它之前看到额外的 13。可能 cout 希望通过在 \n 字符之前添加额外的回车来提供帮助。但是当一个人想要在两个进程之间传输纯字节时,这很烦人。是的,cout 是为了人类可读性,但是有没有办法告诉 cout 或 printf 不要这样做?还是使用另一个不适合人类阅读的流?

【问题讨论】:

  • 某事正在为您的输出添加 DOS 行结尾。 10,例如'\n' 被翻译成"\r\n",这是 DOS CRLF 行的结尾。您打开 "exe1.exe" 的事实表明您在 Windows 上。
  • cout 处于文本模式。改为二进制。
  • @chux 哦,很好。就偷偷溜过去了。

标签: c++ printf ipc cout bytestream


【解决方案1】:

字符10 是ASCII LF,在大多数平台上被视为换行符。特别是在 Windows 上,标准换行符是 13 10 (CRLF) 序列。 C++ 流实现足够聪明,可以知道这一点,并且在文本模式下运行时会将字符 10 转换为 13 10。如果您不希望发生这种情况,则必须将输出流改为二进制模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多