C++ 向量<;浮动>;写入文件

C++ 向量<;浮动>;写入文件,c++,opencv,C++,Opencv,我需要在OpenCV中将类型向量写入文件。 我的部分代码是: vector<float> descriptorsValues; vector<Point> locations; d.compute(img, descriptorsValues, Size(0,0), Size(0,0), locations); 向量描述符值; 矢量位置; d、 计算(img、描述符值、大小(0,0)、大小(0,0)、位置); 我想将描述符值写入文件。我尝试过运算符重载,但不确定如何调

我需要在OpenCV中将类型向量写入文件。 我的部分代码是:

vector<float> descriptorsValues;
vector<Point> locations;
d.compute(img, descriptorsValues, Size(0,0), Size(0,0), locations);
向量描述符值;
矢量位置;
d、 计算(img、描述符值、大小(0,0)、大小(0,0)、位置);
我想将描述符值写入文件。我尝试过运算符重载,但不确定如何调用该函数

// Writing descriptorsValues to a file
fstream data_file;
data_file.open("hog_descriptors.bin", ios::out | ios::in | ios::binary);
fstream& operator << (fstream& o, const Point& e)
{
 return o << e.descriptorsValues;
}

vector<Point>::iterator pos;
for (pos = descriptorsValues.begin(); pos != descriptorsValues.end(); ++pos)
data_file << *pos << endl;
data_file.close();
//将描述符值写入文件
fstream数据文件;
data_file.open(“hog_descriptors.bin”,ios::out | ios::in | ios::binary);
fstream&operator这将起作用:

ofstream data_file;      // pay attention here! ofstream
data_file.open("hog_descriptors.bin", ios::out | ios::binary);

size_t size = descriptorsValues.size();

for (int i = 0; i < size; ++i)
{
    data_file.write(reinterpret_cast<char*>(&descriptorsValues[i]), sizeof(float));
}

data_file.close();
流数据_文件的
注意这里!文件输出流
data_file.open(“hog_descriptors.bin”,ios::out | ios::binary);
size\u t size=descriptorsValues.size();
对于(int i=0;i
或者,就像迈克建议的那样,更好:

ofstream data_file;      // pay attention here! ofstream
data_file.open("hog_descriptors.bin", ios::out | ios::binary);
data_file.write(reinterpret_cast<char*>(&descriptorsValues[0]), descriptorsValues.size()*sizeof(float)); 
data_file.close();
流数据_文件的
注意这里!文件输出流
data_file.open(“hog_descriptors.bin”,ios::out | ios::binary);
data_file.write(reinterpret_cast(&descriptorsValues[0]),descriptorsValues.size()*sizeof(float));
data_file.close();
为了读回它,您需要知道文件中向量上的项数

ifstream data_file;      // NOW it's ifstream
data_file.open("hog_descriptors.bin", ios::in | ios::binary);
descriptorsValues.resize(NUMBER_OF_ITEMS);
data_file.read(reinterpret_cast<char*>(&descriptorsValues[0]), NUMBER_OF_ITEMS*sizeof(float));
data_file.close();
ifstream数据_文件;//现在是ifstream
data_file.open(“hog_descriptors.bin”,ios::in | ios::binary);
描述符值。调整大小(项的数量);
data_file.read(reinterpret_cast(&descriptorsValues[0]),项目数*sizeof(float));
data_file.close();
上面这一条同样有效,因为vector中的数据保证按顺序对齐,所以如果您得到第一个项目的指针,那么使用
descriptorsValues.size()*sizeof(float)
计算缓冲区的大小会快一点

这会有用的:

ofstream data_file;      // pay attention here! ofstream
data_file.open("hog_descriptors.bin", ios::out | ios::binary);

size_t size = descriptorsValues.size();

for (int i = 0; i < size; ++i)
{
    data_file.write(reinterpret_cast<char*>(&descriptorsValues[i]), sizeof(float));
}

data_file.close();
流数据_文件的
注意这里!文件输出流
data_file.open(“hog_descriptors.bin”,ios::out | ios::binary);
size\u t size=descriptorsValues.size();
对于(int i=0;i
或者,就像迈克建议的那样,更好:

ofstream data_file;      // pay attention here! ofstream
data_file.open("hog_descriptors.bin", ios::out | ios::binary);
data_file.write(reinterpret_cast<char*>(&descriptorsValues[0]), descriptorsValues.size()*sizeof(float)); 
data_file.close();
流数据_文件的
注意这里!文件输出流
data_file.open(“hog_descriptors.bin”,ios::out | ios::binary);
data_file.write(reinterpret_cast(&descriptorsValues[0]),descriptorsValues.size()*sizeof(float));
data_file.close();
为了读回它,您需要知道文件中向量上的项数

ifstream data_file;      // NOW it's ifstream
data_file.open("hog_descriptors.bin", ios::in | ios::binary);
descriptorsValues.resize(NUMBER_OF_ITEMS);
data_file.read(reinterpret_cast<char*>(&descriptorsValues[0]), NUMBER_OF_ITEMS*sizeof(float));
data_file.close();
ifstream数据_文件;//现在是ifstream
data_file.open(“hog_descriptors.bin”,ios::in | ios::binary);
描述符值。调整大小(项的数量);
data_file.read(reinterpret_cast(&descriptorsValues[0]),项目数*sizeof(float));
data_file.close();

上面这一条同样有效,因为vector中的数据保证按顺序对齐,所以如果您得到第一个项目的指针,那么使用
descriptorsValues.size()*sizeof(float)
计算缓冲区的大小会快一点

我在你的帖子中读到你正在使用OpenCV。 OpenCV中有一个序列化库(在OpenCV核心中),请参阅

因此,您可以尝试以下方法:

#include <opencv2/core/core.hpp>
#include <string>

using namespace cv;
int main(int _argc, const char ** _argv)
{
    std::vector<int> toto;
    toto.push_back(1);
    toto.push_back(2);
    string filename = "I.xml";
    FileStorage fs(filename, FileStorage::WRITE);        
    fs << "toto" << toto;
    fs.release();
}
#包括
#包括
使用名称空间cv;
int main(int_argc,const char**u argv)
{
std::向量toto;
toto.推回(1);
toto.推回(2);
字符串filename=“I.xml”;
FileStorage fs(文件名,FileStorage::WRITE);
托托雷德;
fsRead.release();

std::cout我在你的帖子中读到你正在使用OpenCV。 OpenCV中有一个序列化库(在OpenCV核心中),请参阅

因此,您可以尝试以下方法:

#include <opencv2/core/core.hpp>
#include <string>

using namespace cv;
int main(int _argc, const char ** _argv)
{
    std::vector<int> toto;
    toto.push_back(1);
    toto.push_back(2);
    string filename = "I.xml";
    FileStorage fs(filename, FileStorage::WRITE);        
    fs << "toto" << toto;
    fs.release();
}
#包括
#包括
使用名称空间cv;
int main(int_argc,const char**u argv)
{
std::向量toto;
toto.推回(1);
toto.推回(2);
字符串filename=“I.xml”;
FileStorage fs(文件名,FileStorage::WRITE);
托托雷德;
fsRead.release();

std::cout为什么重新解释?需要解释一下吗?如果你要这样做,你可以用大小为
descriptorsValues.size()*sizeof descriptorsValues[0]
的单块写入来替换循环,因为该方法的签名是
of stream::write(char*,size\u t)
和&descriptorsValues[i]是一个
浮点数*
,因此您必须强制转换it@Matt一旦向量始终对齐,解算就更好了!为什么要重新解释?请注意解释?如果要这样做,您最好用大小
descriptorsValues.size()*sizeof descriptorsValues[0]的单块写入来替换循环
因为方法的签名是stream::write(char*,size\u t)的
和&descriptorsValues[i]是一个
浮点数*
,因此您必须强制转换it@Matt一旦向量始终对齐,解算就更好了!你必须决定使用什么文件格式。瓦格纳·帕特里奥塔的解决方案只是对浮动进行内存转储,如果你以后要从同一个程序中读取浮动,这是可以的,但如果你打算读取浮动,则可能会产生疑问通过一个不同的可执行文件,可能会使用不同的浮动格式,或者如果你打算将它们发送到另一台电脑,等等。它正在崩溃?它会写吗?请更具体一点,你必须决定使用什么文件格式。Wagner Patriota的解决方案只是对浮动进行内存转储,如果你要读取浮动,这是可以的我稍后会从同一个程序中加入,但如果您打算通过不同的可执行文件读取它们,可能会使用不同的浮动格式,或者如果您打算将它们发送到另一台PC,等等,则可能会产生疑问。它正在崩溃?它是否会写入?请更具体地说,这是一个极好的示例。这是一个极好的示例。