问题描述
我有两个通过iostream通信的c ++ exe。第一个exe发送一个char(或字节)流,第二个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,9, 13 ,10,13 ...
10处有问题,在此之前您可以看到另外13处。 cout可能希望通过在\ n字符之前添加额外的回车符来提供帮助。但是当人们想要在两个进程之间传输纯字节时,这很烦人。是的,cout是为了人类可读性,但是有没有办法告诉cout或printf不这样做呢?还是使用另一种不适合人类阅读的信息流?
解决方法
字符10
是ASCII LF
,在大多数平台上被视为换行符。特别是在Windows上,标准换行符是13 10
(CRLF
)序列。 C ++流实现足够聪明,足以知道这一点,并且在文本模式下运行时,会在输出时将字符10
转换为13 10
。如果您不希望发生这种情况,则必须将输出流置于二进制模式。