чтение всего двоичного файла в массив в одном вызове c++
Я пытаюсь прочитать бинарный файл в массив структуры
struct FeaturePoint
{
FeaturePoint (const int & _cluster_id,
const float _x,
const float _y,
const float _a,
const float _b
) : cluster_id (_cluster_id), x(_x), y(_y), a(_a), b(_b) {}
FeaturePoint (){}
int cluster_id;
float x;
float y;
float a;
float b;
};
код ниже работает, но делает это по одному элементу за раз, нажимая каждый новый элемент на массив
void LoadImageFeaturesFromBinaryFile(const char * FileName, std::vector<FeaturePoint>& features )
{
char strInputPath[200];
strcpy (strInputPath,"/mnt/imagesearch/tests/");
strcat (strInputPath,FileName);
strcat (strInputPath,".bin");
features.clear();
ifstream::pos_type size;
ifstream file (strInputPath, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
cout<< "this file size is : "<<size<<" for "<<strInputPath<<" " <<sizeof( FeaturePoint )<<endl;
file.seekg (0, ios::beg);
while (!file.eof())
{
try
{
FeaturePoint fp;
file.read( reinterpret_cast<char*>(&fp), sizeof( FeaturePoint ) );
features.push_back(fp);
}
catch (int e)
{ cout << "An exception occurred. Exception Nr. " << e << endl; }
}
sort (features.begin(), features.begin()+features.size(),CompareClusterIndexes);
file.close();
}
}
Я хочу ускорить его, прочитав весь массив сразу, что, по-моему, должно выглядеть примерно следующим образом
void LoadImageFeaturesFromBinaryFile(const char * FileName, std::vector<FeaturePoint>& features )
{
char strInputPath[200];
strcpy (strInputPath,"/mnt/imagesearch/tests/");
strcat (strInputPath,FileName);
strcat (strInputPath,".bin");
features.clear();
ifstream::pos_type size;
ifstream file (strInputPath, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
file.seekg (0, ios::beg);
features.reserve( size/sizeof( FeaturePoint ));
try
{
file.read( reinterpret_cast<char*>(&features), size );
}
catch (int e)
{ cout << "An exception occurred. Exception Nr. " << e << endl; }
sort (features.begin(), features.begin()+features.size(),CompareClusterIndexes);
file.close();
}
else cout << strInputPath<< " Unable to open file for Binary read"<<endl;
}
но чтение вызывает ошибку seg, как это исправить?
3 ответов
это не так:
features.reserve( size/sizeof( FeaturePoint ));
вы собираетесь читать данные в вектор, вы должны изменить его размер, а не просто зарезервировать, как это:
features.resize( size/sizeof( FeaturePoint ));
это не так:
file.read( reinterpret_cast<char*>(&features), size );
вы не записываете данные вектора там, вы перезаписываете саму структуру, наряду с кто знает, что еще. Должно быть так:
file.read( reinterpret_cast<char*>(&features[0]), size );
как сказал Немо, это вряд ли улучшит вашу производительность.
Я думаю, вы хотите
file.read( reinterpret_cast<char*>(&features[0]), size );
вы также должны убедиться, что size
несколько sizeof(FeaturePoint)
. Иначе вы будете читать слишком много.