2011-06-27 10 views
6

Tôi cố gắng để đọc một tập tin nhị phân vào một mảng của cấu trúcđọc toàn bộ tập tin nhị phân thành một mảng trong single gọi 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; 
}; 

Các mã bên dưới công trình nhưng không một yếu tố này cùng một lúc, bằng cách đẩy mỗi yếu tố mới vào một mảng

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

tôi muốn tăng tốc độ nó lên bằng cách đọc toàn bộ mảng trong cùng một lúc, mà tôi nghĩ nên tìm một cái gì đó như sau

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

Nhưng đọc được gây ra một lỗi seg, làm thế nào để sửa lỗi này?

+3

Tôi dự đoán rằng khi bạn làm việc này, bạn sẽ ngạc nhiên về mức độ cải thiện hiệu suất của nó. – Nemo

+1

Làm cho bạn một ưu tiên và sử dụng 'std :: string' thay vì' strcat'. –

Trả lời

3

này là sai:

features.reserve(size/sizeof(FeaturePoint)); 

Bạn đang về để đọc dữ liệu vào vector, bạn nên thay đổi kích thước, không chỉ dự trữ, như thế này:

features.resize(size/sizeof(FeaturePoint)); 

Đây cũng là sai:

file.read(reinterpret_cast<char*>(&features), size); 

Bạn không ghi đè dữ liệu của vectơ đó, bạn sẽ ghi đè cấu trúc, cùng với w ho biết điều gì khác. Phải là:

file.read(reinterpret_cast<char*>(&features[0]), size); 

Như Nemo đã nói, điều này không có khả năng cải thiện hiệu suất của bạn.

+0

Thiếu và bật các tính năng [0]? – Pablo

+0

Phải, điều này khởi tạo toàn bộ mảng (lớn hơn bộ nhớ cache), sau đó điền vào. Vì vậy, ngay cả khi đĩa không phải là nút cổ chai, điều này sẽ không nhanh hơn mã gốc. "dự trữ" cộng với "push_back" thường nhanh hơn ... Nếu bạn không đọc từ đĩa triệu lần chậm hơn so với bộ nhớ. – Nemo

0

features của bạn có loại là một tiêu chuẩn :: vectơ và bạn sắp xếp nó thành char. Loại véc tơ không phải là một mảng.

0

Tôi nghĩ rằng bạn muốn

file.read(reinterpret_cast<char*>(&features[0]), size); 

Bạn cũng cần phải chắc chắn rằng size là bội số của sizeof(FeaturePoint). Nếu không, bạn sẽ đọc hơi quá nhiều.