无法将特定内容写入字符串流

时间:2018-04-13 18:09:19

标签: c++ linux

我有一些示例代码从文件中读取一些二进制数据,然后将内容写入stringstream。

#include <sstream>
#include <cstdio>
#include <fstream>
#include <cstdlib>

std::stringstream * raw_data_buffer;
int main()
{
  std::ifstream is;
  is.open ("1.raw", std::ios::binary );

  char * buf = (char *)malloc(40);
  is.read(buf, 40);

  for (int i = 0; i < 40; i++)
    printf("%02X ", buf[i]);

  printf("\n");

  raw_data_buffer = new std::stringstream("", std::ios_base::app | std::ios_base::out | std::ios_base::in | std::ios_base::binary);
  raw_data_buffer -> write(buf, 40);

  const char * tmp = raw_data_buffer -> str().c_str();
  for (int i = 0; i < 40; i++)
    printf("%02X ", tmp[i]);
  printf("\n");

  delete raw_data_buffer;
  return 0;
}

使用我拥有的特定输入文件,程序无法正常运行。您可以下载测试文件here

所以问题是,我将文件内容写入raw_data_buffer并立即将其读回,内容不同。该程序的输出是:

FFFFFFC0 65 59 01 00 00 00 00 00 00 00 00 00 00 00 00 FFFFFFE0 0A 40 00 00 00 00 00 FFFFFF80 08 40 00 00 00 00 00 70 FFFFFFA6 57 6E FFFFFFFF 7F 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFFFFFE0 0A 40 00 00 00 00 00 FFFFFF80 08 40 00 00 00 00 00 70 FFFFFFA6 57 6E FFFFFFFF 7F 00 00

内容FFFFFFC0 65 59 01被0覆盖。为什么会这样?

1 个答案:

答案 0 :(得分:2)

我怀疑这是使用释放内存时未定义行为的症状。您从字符串流中获取getting a copy of the string,但您只是抓取指向内部的原始指针,然后立即将其删除。 (该链接实际上警告这个确切的情况)

tmp

str()的任何使用都会表现出未定义的行为,并且很容易导致您看到的问题。将svg{ pointer-events: none } svg>rect{ position: relative; pointer-events: auto; } 的结果保留在范围内。