如何在C++中获取二进制数据作为向量<complex>?
How to get binary data as a vector<complex> in C++?
我正试图读取二进制数据,并将它们从文件中写入矢量:
std::ofstream outfile1("channel_1.dat", std::ios::binary | std::ios::out);
//...
outfile1.write((const char*)&buff1.front(), nwrite * sizeof(complex<short>));
我编写了读取该文件的代码:
int main(){
double total_bytes, vector_size;
streampos begin,end;
std::ifstream ifs("channel_1.dat", std::ios::binary | std::ios::in);
begin = ifs.tellg();
ifs.seekg (0, ios::end);
end = ifs.tellg();
total_bytes = end - begin; // 320MB, 32e7
vector_size = total_bytes/ sizeof(complex<short>); // 8e7
std::vector<std::complex<float> > v(vector_size);
ifs.read(reinterpret_cast<char*>(v.data()), vector_size*sizeof(complex<short>));
ifs.close();
for(int i=0;i<vector_size; i++){
std::cout <<i << v[i]<< std::endl;
}
}
但是对于所有的复向量,我仍然得到0,大约8e7个样本:
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
...
我在matlab中使用了相同的文件,它工作了。有人能帮帮我吗?
std::vector buf(N/sizeof(double));//为N/8个double预留空间infile.read (reinterpret_cast (buf.data ()), buf.size () * sizeof(双));//或&buf[0] for c++ 98
假设整个文件是double,否则这将无法正常工作。使用这种格式…我希望它能成功
short
是一个有符号平台相关的整数类型。在我的机器上,它是2字节长。float
是一个4字节长的浮点类型。此外,现代机器(包括x86)上的浮点类型与整数类型有本质上的不同,它们也更复杂。所以你不能把一组2字节的整数用二进制表示然后把它们放入float
s中。如果您这样做,您将在浮点变量中获得垃圾,而不是您想要的数据。
所以一个正确的变体是声明一个兼容的存储:
std::vector<std::complex<short>> vs(vector_size);
读取数据:
ifs.read(reinterpret_cast<char*>(vs.data()), vector_size*sizeof(complex<short>));
,然后将数据复制到浮点复数向量:
std::vector<std::complex<float> > v(vector_size);
std::copy(vs.begin(), vs.end(), v.begin());
std::copy
在这种情况下将使用std::complex
的赋值运算符,它可以正确处理底层数据的short
-> float
强制转换。
最后但并非最不重要的。你叫
ifs.seekg(0, ios::end);
所以现在您的文件游标位于文件的末尾,任何读取尝试都不会读取任何内容,使vs
保持不变。我假设您构建了一个调试版本,因此vs
最初为零。在ifs.read
电话之后,你可以不碰它们。要从文件中获取数据,请调用
ifs.seekg(0, ios::beg);
在ifs.read
之前。以下是在我的机器上运行良好的代码示例:
int main() {
double total_bytes, vector_size;
streampos begin,end;
std::ifstream ifs("data.dat", std::ios::binary | std::ios::in);
begin = ifs.tellg();
ifs.seekg (0, ios::end);
end = ifs.tellg();
total_bytes = end - begin; // 320MB, 32e7
vector_size = total_bytes/ sizeof(complex<short>); // 8e7
std::cout << vector_size << std::endl;
ifs.seekg(0, ios::beg);
std::vector<std::complex<short>> vs(vector_size);
std::vector<std::complex<float> > v(vector_size);
ifs.read(reinterpret_cast<char*>(vs.data()), vector_size*sizeof(complex<short>));
std::copy(vs.begin(), vs.end(), v.begin());
ifs.close();
for(int i=0;i<vector_size; i++){
std::cout <<i << v[i]<< std::endl;
}
return 0;
}
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 呼叫运营商<<临时
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- (C 14)操作员&lt;&lt;超负荷无法正如智能指针向量所预期的那样工作
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类