我正在尝试写一个命名管道(所以我们可以说它是一个文件)。
我正在将此结构写入我的文件:
struct ProcessData
{
int _processNumber;
int _threadStatus;
};
processNumber
和threadStatus
初始化为0。
我这样写我的结构:
if (write(this->_fd, &data, sizeof(ProcessData)) == -1)
{
std::cerr << "Write failed" << std::endl;
exit(EXIT_FAILURE);
}
并以这种方式阅读:
#define MAX_BUF 1024
int main()
{
int fd;
char * myfifo = "/tmp/the_plazza";
char buf[MAX_BUF];
/* open, read, and display the message from the FIFO */
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX_BUF);
printf("Received: %s\n", buf);
close(fd);
return 0;
}
但我收到的输出并不好:
/tmp ./a.out | hexdump
0000000 6552 6563 7669 6465 203a 000a
000000b
知道为什么吗?
答案 0 :(得分:4)
您无法打印二进制结构的值,就好像它是一个字符串一样。而且您不需要读入中间缓冲区。只需直接阅读您的类型变量:
ProcessData val;
fd = open(myfifo, O_RDONLY);
read(fd, &val, sizeof(val));
std::cout << val._processNumber;
答案 1 :(得分:3)
您编写原始二进制数据,在阅读之后将其视为字符串。这根本行不通。您可以将其写为(set)字符串并将其读作一组字符串或,将其写为原始二进制文件并读取为原始二进制数据。
答案 2 :(得分:0)
要重申其他人所说的内容,您已经存储了包含两个struct
值的int
的二进制表示,但您正在阅读它以char
的数组形式返回并尝试将其显示为字符串。您期待什么看作什么输出?提示:它不会成为"00"
。
但是还有另一个问题需要解决。只要读者和作者在同一平台上,读取和写入struct
类型的二进制表示就可以工作,但只要你尝试从一个平台写入并从另一个平台读取,就会遇到麻烦。类型大小可能不同,字节顺序可能不同,对齐要求可能不同等。您可能希望阅读serialization技术。