2017-04-03 184 views
0

我有裝載問題/讀取如何在C++中將二進制文件加載到「vector <vector < bitset<32>>」中?

vector<vector< bitset<32> > 

(被稱爲/在我的代碼Typedef的人口)

它使用下面的代碼保存:

void genetic_algorithm::save_generation(population pop_to_save, string filename){ 
    std::ofstream file(filename, std::ofstream::binary); 
    unsigned long n; 
    for(size_t i = 0; i < pop_to_save.size(); i++) 
    { 
    if (pop_to_save[i].size() > 0) 
    { 
     n = pop_to_save[i][0].to_ulong(); 
     const char* buffer = reinterpret_cast<const char*>(&n); 
     file.write(buffer, pop_to_save[i].size()); 
    } 
    } 
} 

的我需要的東西是一個可以加載的函數,即:

population genetic_algorithm::load_generation(string filename){ 
    // TODO 
} 

最好的問候,

Mathias。

編輯

我已經解決了我自己的問題(從評論有點幫助) 這裏爲任何最終的代碼,可能會面臨同樣的問題:

void genetic_algorithm::save_generation(population pop_to_save, string filename){ 
    std::ofstream file(filename, std::ofstream::binary); 
    unsigned long n; 
    for(size_t i = 0; i < pop_to_save.size(); i++) { 
    for (size_t j = 0; j < pop_to_save[i].size(); j++) { 
     n = pop_to_save[i][j].to_ulong(); 
     file.write(reinterpret_cast<const char*>(&n), sizeof(n)); 
    } 
    } 

    std::cout << "Saved population to: " << filename << '\n'; 
} 

population genetic_algorithm::load_generation(string filename){ 
    std::ifstream file(filename, std::ofstream::binary); 
    population loaded_pop (20, std::vector<bitset<32>> (394,0)); 
    unsigned long n; 
    for(size_t i = 0; i < 20; i++) { 
    for (size_t j = 0; j < 394; j++) { 
     file.read(reinterpret_cast<char*>(&n), sizeof(n)); 
     loaded_pop[i][j] = n; 
    } 
    } 

    std::cout << "Loaded population from: " << filename << '\n'; 
    return loaded_pop; 
} 

回答

0

我檢查你的方法genetic_algorithm::save_generation(),這是我發現:

  • bitset<32>存儲32位打包形式(可能是一個unsigned int與32位或類似的東西)。

  • vector<bitset<32> >存儲這樣的位組的動態數組。

  • vector<vector<bitset<32> > >存儲這種動態數組的位組。

到目前爲止,這麼好。在您的方法genetic_algorithm::save_generation()中,循環遍歷外部向量的所有元素以轉儲每個內部向量的內容(如果不爲空)。

file.write(buffer, pop_to_save[i].size());可能不是你想要的。第二個arg。 std::ostream::write()是字符數。你通過size()或resp。內部向量,返回元素的數量(但不是以字節爲單位的大小)。但元素大小(bitset<32>)可能比字符大。更好的方法(儘管不是最好的)將使用file.write(buffer, 4 * pop_to_save[i].size());。 (sizeof (char):1,sizeof bitset<32>:希望4但我會檢查這個。)

因此,更安全的是使用file.write(buffer, pop_to_save[i].size() * sizeof pop_to_save[i][0]);。這更好,但仍不完美。如果你想在多個平臺上使用你的應用程序,這可能會失敗,因爲文件格式現在變成平臺。 (這取決於sizeof pop_to_save[i][0]。)

因此,最好的方法是對內部矢量也做一個嵌套循環,並用一種​​平臺獨立大小(例如std::uint32_t)分別存儲它們的元素。

然而,我的實際問題是一個設計問題:

如果存儲動態數組的動態數組(其中每個內部數組可以是任意大小的),那麼您可以選擇存儲元件的數量,這些內陣列也。這是我想你的方法genetic_algorithm::save_generation()

可能是,您的加載問題是由於您必須預留或調整要加載的位的內部向量的事實而引起的,但您不知道具有哪種大小。我的回答:你無法知道。此信息缺失(並且必須以某種方式提供,例如由文件本身提供)。

相關問題