将UNIX管道映射到C ++ std :: cout

时间:2017-01-09 12:01:53

标签: c++ unix pipe stdout

我正在研究用C ++进行通信过程的选项。开始想把Unix管道绑定到std :: cout,但我可以让它工作。当使用write(STDOUT_FILENO)直接写入时,我得到了预期的结果。当使用std :: cout编写时,我会得到更小的随机输出。

FragmentB

1 个答案:

答案 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