我正在研究用C ++进行通信过程的选项。开始想把Unix管道绑定到std :: cout,但我可以让它工作。当使用write(STDOUT_FILENO)直接写入时,我得到了预期的结果。当使用std :: cout编写时,我会得到更小的随机输出。
FragmentB
答案 0 :(得分:1)
让我们仔细看看你的写作:
write(STDOUT_FILENO,&data,sizeof(int)); // Works
//std::cout << data; // Don't work
第一个&#34;工作&#34; version以原始二进制形式将data
的内容写入标准输出。第二个&#34;非工作&#34;版本将data
的值作为文本 写入标准输出。
如果data
的值为5
,则write
调用将写入整数值5
,而std::cout << data
将写入整数值{{1 (使用ASCII encoding)。
当您将数据作为父级的原始和二进制53
读取时,这当然会产生影响。
如果要将原始二进制数据写入int
,则必须使用std::ostream::write
:
std::cout
上述行等同于您拥有的std::cout.write(reinterpret_cast<char*>(&data), sizeof data);
系统调用。
同样重要的是要知道以原始格式编写write
将写入int
个字节,通常为4个字节。将单个数字整数写为文本将写入一个字节。
您的循环将写入8个数字,这意味着如果使用sizeof(int)
,它将写入32个字节(4 * 8)。如果使用write
输出到<<
,那么您将写入8个字节。当您阅读时,您将读取这8个字节并输入两个单std::cout
个值,然后int
调用将返回read
,因为管道已关闭。
这两个0
值的值取决于您的硬件架构,如果它是little-endian or big-endian。