【发布时间】:2017-02-14 20:33:41
【问题描述】:
我假装将std::complex<float> 的std::vector 存储在二进制文件中,然后再将该数据加载到std::vector 中。我在 SO 中检查了类似的问题,并提出了以下代码:
#include <complex>
#include <iostream>
#include <memory>
#include <fstream>
#include <iterator>
#include <random>
#include <vector>
using namespace std;
typedef vector<complex<float>> complex_vector;
float get_random(){
static std::default_random_engine e;
static std::uniform_real_distribution<> dis(-10, 10);
return dis(e);
}
int main(){
// Random number generator
srand(static_cast<unsigned> (time(0)));
// Create a vector with 25 random complex<float> values
std::shared_ptr<vector<complex<float>>> buffer = std::make_shared<vector<complex<float>>>();
for(unsigned int i=0; i<25; i++){
buffer->push_back(complex<float>(get_random(), get_random()));
}
// Write those values into a binary file
std::string binFileName = "aux.bin";
std::ofstream rawFile(binFileName, std::ios::binary);
for(unsigned int i=0; i<buffer->size(); i++){
rawFile.write(reinterpret_cast<const char*>(&buffer->at(i)), sizeof(complex<float>));
}
rawFile.close();
// Load the binary file into the buffer
std::ifstream input(binFileName, std::ios::binary);
complex_vector auxBuffer{std::istream_iterator<complex<float>>(input), std::istream_iterator<complex<float>>()};
unsigned int samplesRead = auxBuffer.size();
std::cout << samplesRead;
return 0;
}
输出:
0
我错过了什么?
编辑: 在 NathanOliver 的回答之后,这就是我的代码现在的样子:
#include <complex>
#include <iostream>
#include <memory>
#include <fstream>
#include <iterator>
#include <random>
#include <vector>
using namespace std;
typedef vector<complex<float>> complex_vector;
float get_random(){
static std::default_random_engine e;
static std::uniform_real_distribution<> dis(-10, 10);
return dis(e);
}
int main(){
// Random number generator
srand(static_cast<unsigned> (time(0)));
// Create a vector with 25 random complex<float> values
std::shared_ptr<complex_vector> buffer = std::make_shared<complex_vector>();
for(unsigned int i=0; i<25; i++){
buffer->push_back(complex<float>(get_random(), get_random()));
}
// Write those values into a binary file
std::string binFileName = "aux.bin";
std::ofstream rawFile(binFileName, std::ios::binary);
rawFile.write(reinterpret_cast<const char*>(buffer->size()), sizeof(buffer->size()));
rawFile.write(reinterpret_cast<const char*>(buffer->data()), sizeof(std::complex<float>) * buffer->size());
rawFile.close();
// Load the binary file into the buffer
std::ifstream input(binFileName, std::ios::binary);
complex_vector::size_type nSamples;
input.read(reinterpret_cast<char*>(nSamples), sizeof(complex_vector::size_type));
std::cout << nSamples;
complex_vector *destination = new complex_vector(25);
input.read(reinterpret_cast<char*>(destination->data()), sizeof(std::complex<float>) * nSamples);
return 0;
}
我在第一次调用 write 函数时得到了一个 SIGSEGV。
另外,我不明白我为什么要写作,但我必须阅读。
【问题讨论】:
-
您可能缺少
std::ios::out和std::ios::in标志。您是否检查过您的文件是否实际创建并包含数据? -
您不能将二进制写入与格式化读取混合使用。如果你
write你需要的数据read数据。为了更容易,您应该首先write向量的大小,这样您就可以read它并分配存储空间,以便您可以read在数据中。 -
不要将
srand与std::default_random_engine混为一谈 :) -
@NathanOliver 到底哪里出了问题?我看到类似的例子是这样完成的......我既用二进制写又读,所以我不明白出了什么问题
-
您没有阅读二进制文件。
complex_vector auxBuffer{std::istream_iterator<complex<float>>(input), std::istream_iterator<complex<float>>()};不会进行二进制读取,即使文件以二进制模式打开。