【问题标题】:How to Save and Read Binary Data?如何保存和读取二进制数据?
【发布时间】:2016-11-22 17:08:59
【问题描述】:

我再次需要您的帮助来保存和读取二进制数据。我有一个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。

希望大家帮忙

非常感谢。

【问题讨论】:

  • @Sergey Sergey 我希望你能在这个问题上帮助我,我仍然对二进制数据感到困惑。非常感谢。
  • “当我与原始文本数据进行比较时,它们是不同的” 不同如何?请发布示例输出(加上您的预期)。还有你是怎么比较的?
  • &xy[i] 也许有道理,也许没有。 vector 不是经典的 C 数组。并且索引运算符是“模拟的”
  • @UnholySheep 这是一个输出:(-28153,20316) (23951,20299)(-23260,20281) (10184,20268) (12796,20245) 有 2560 行。我期望复杂的数据必须是: (1.00663576e+08,2.21873700e+07) (1.96770960e+07,7.86981300e+06) (1.48334580e+07,1.66604570e+07) (4.34163400e+07, 3.11434200e+07) (3.44546400e+07,3.15276640e+07)
  • @UnholySheep 和我试图读取二进制数据的代码: ifstream input(filename.c_str() , std::ios::binary | std::ios::in);矢量>矢量(矢量大小); input.seekg(0, ios::beg); input.read(reinterpret_cast(vector.data()), (2650 * sizeof(complex)));

标签: c++


【解决方案1】:

我写了一个演示,可以在我的电脑上运行。

#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;
}

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

【讨论】:

  • 嗨 felix,我正在尝试使用您的代码,当我创建矢量复数 (0,1)(2,3)(4,5)(6,7)( 8,9)....但是当我试图获取这些数据时: (1.11122130e+07,1.92728450e+06)(2.92449620e+07,1.50776630e+07)(9.36541200e+07,5.38220040e+07 )(2.16838928e+08,1.09020568e+08)... 它给了我不同的数字:(-18123,19347)(-28519,19272)(-14506,19421)(27752,19550)... 我愿意不认为我收集了正确的数据,即使我使用 matlab 绘图,它们也有很大不同。我想我想得到的数据是高价值的数字,你有什么理想的吗,菲利克斯?
  • 有人建议我尝试使用 read complex 16 或 32,但我仍然不明白如何使它工作,希望你能给我更理想的吗?谢谢你,菲利克斯。
  • 您是否尝试运行类似 std::complex value(1e7,2e6); ?
  • felix,是的,我正在尝试运行具有高值的那些数据,以及大约 2560 行向量复数。
  • 1e7 超出了空头通常可以持有的范围。我建议你使用 double 而不是 short,前者可以提供 15-17 个十进制数字的精度,这应该足够了。 double, value range
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多