如何保存和读取二进制数据?

时间:2016-11-22 17:09:00

标签: c++

我再次需要你的帮助来保存和读取二进制数据。我有一个vector<<complex> > xy(256),它可以从硬件中读取10次:

vector<<complex> > xy(256);
ofstream outfile2 (outfilename2.c_str() , ofstream::binary);
....
....
for(unsigned t = 0; t < 10; t++)
{
     ....
     ....
     for(unsigned i = 0; i < 256; i++)
     {
           xy[i] = f[i] * conj(g[i]);
     }
     for(unsigned i = 0; i < 256; i++)
     {
           outfile2 << boost::format("%20.8e") % xy[i]<< endl;  // write in text
     }
}  // the text data will be 2560 lines of complex data, for example:
   // (6.69635350e+06,7.34146150e+06)

现在,我正在尝试使用以下命令保存到二进制文件中:

for(unsigned i = 0; i < 256; i++)
     {
        outfile2.write((const char*)& xy[i], 1 * sizeof(complex<short>));
        outfile2.flush();
     }

虽然,它仍然给我一个数据,但是当我与原始文本数据进行比较时,它们是不同的。我不明白为什么?

我想用浮点数据读取复数16。

我希望你们能提供帮助。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我已经编写了一个可以在我的计算机上运行的演示。

#include <cassert>

#include <complex>
#include <fstream>
#include <iostream>
#include <type_traits>
#include <vector>

int main() {
  assert( std::is_trivially_copy_assignable<std::complex<short> >::value );

  std::vector<std::complex<short> > vtr(256);
  for (int i=0; i<256; ++i)
    vtr[i] = std::complex<short>(i*2,i*2+1);

  {
    std::ofstream output("data.bin", std::ofstream::binary);
    for (int i=0; i<256; ++i)
      output.write((char *)&vtr[i],sizeof(vtr[i]));
  }
  vtr.clear();

  std::cout << vtr.size() << std::endl;

  vtr.resize(256);
  {
    std::ifstream input("data.bin", std::ifstream::binary);
    for (int i=0; i<256; ++i)
      input.read((char *)&vtr[i],sizeof(vtr[i]));
  }

  for (size_t i=0; i<vtr.size(); ++i)
    std::cout << vtr[i] << " ";
  std::cout << std::endl;

  return 0;
}

您可以在计算机上运行此演示。如果此演示有效,则可能是您在代码中犯了一些错误。请提供一个完整且可验证的示例。