2016-11-22 4 views
0

Мне нужна ваша помощь снова для сохранения и чтения данных в двоичном формате. У меня есть, 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 с данными с плавающей запятой.

Надеюсь, вы, ребята, можете помочь.

спасибо.

+0

@ Сергей Сергей Надеюсь, вы можете мне помочь по этому вопросу, я все еще запутался по двоичным данным. Большое спасибо. –

+2

* «когда я сравниваю исходные текстовые данные, они были разными» * разные как? пожалуйста, отправьте пример вывода (плюс то, что вы ожидали). также как вы его сравниваете? – UnholySheep

+0

& xy [i] может иметь смысл, может быть, нет. вектор не является класическим массивом C. и оператор индексирования «эмулируется» –

ответ

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

Вы можете запустить эту демонстрацию на своем компьютере. Если эта демонстрация работает, вероятно, вы допустили некоторые ошибки в своем коде. Просьба представить полный и проверенный пример.

+0

hi 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 для построения, они сильно отличаются друг от друга. Я думаю, данные, которые я пытаюсь получить, - это номера с высоким значением. У вас есть идеальный, Феликс? –

+0

Кто-то предложил мне попробовать прочитать комплекс 16 или 32, но я до сих пор не понимаю, как заставить его работать, надеюсь, что вы можете дать мне больше идеала? спасибо, Феликс. –

+0

Вы пытаетесь запустить что-то вроде std :: complex value (1e7,2e6); ? – felix

Смежные вопросы