将结构写入文件会给我错误的结果

时间:2016-04-15 18:53:49

标签: c++

我正在尝试写一个命名管道(所以我们可以说它是一个文件)。

我正在将此结构写入我的文件:

struct ProcessData
{
    int _processNumber;
    int _threadStatus;
};

processNumberthreadStatus初始化为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

知道为什么吗?

3 个答案:

答案 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技术。