2017-03-09 102 views
0

我正在處理涉及二進制文件的項目。 所以我開始研究二進制文件,但我仍然對如何編寫和填寫從我之前寫的二進制文件的向量感到困惑寫入和讀取二進制文件以填充矢量 - C++

這是代碼:寫作。

void binario(){ 
ofstream fout("./Binario/Data.AFe", ios::out | ios::binary); 
vector<int> enteros; 
enteros.push_back(1); 
enteros.push_back(2); 
enteros.push_back(3); 
enteros.push_back(4); 
enteros.push_back(5); 
//fout.open() 
//if (fout.is_open()) { 
    std::cout << "Entre al if" << '\n'; 
    //while (!fout.eof()) { 
     std::cout << "Entre al while" << '\n'; 
     std::cout << "Enteros size: "<< enteros.size() << '\n'; 
     int size1 = enteros.size(); 
     for (int i = 0; i < enteros.size(); i++) { 
      std::cout << "for " << i << '\n'; 
      fout.write((char*)&size1, 4); 
      fout.write((char*)&enteros[i], size1 * sizeof(enteros)); 
      //cout<< fout.get(entero[i])<<endl; 
     } 
     //fout.close(); 
    //} 
    fout.close(); 
    cout<<"copiado con exito"<<endl; 
//} 
} 

這裏的代碼閱讀:

oid leerBinario(){ 
vector<int> list2; 

ifstream is("./Binario/Data.AFe", ios::binary); 
    int size2; 
    is.read((char*)&size2, 4); 
    list2.resize(size2); 


    is.read((char*)&list2[0], size2 * sizeof(list2)); 

    std::cout << "Size del vector: " << list2.size() <<endl; 
    for (int i = 0; i < list2.size(); i++) { 
     std::cout << i << ". " << list2[i] << '\n'; 
    } 
    std::cout << "Antes de cerrar" << '\n'; 
    is.close(); 
} 

如果我寫正確的文件,我不知道,這只是測試,所以我不要弄亂我的主要文件,而不是編寫數字,我需要保存存儲在向量中的對象,並在用戶每次運行程序時加載它們。

+0

回讀您編寫的文件並獲得與您所寫的相同的值將是您是否正確寫入文件的一個很好的測試。 –

+2

我不明白爲什麼你爲每個單獨的向量元素編寫'enteros.size()'而不是隻寫一次。當你寫'enteros [i]''你肯定不需要'enteros.size()* sizeof(enteros)'因爲這是整個向量中字節的5倍 - 你可能需要'sizeof(enteros [i] )' –

回答

0

不,你有點困惑。您在每次迭代中都會寫入大小,然後當您嘗試寫入值時,您會完全未定義某些內容。當你使用矢量時,你可以在沒有循環的情況下做到這一點。

fout.write(&size1, sizeof(size1)); 
fout.write(enteros.data(), size1 * sizeof(int)); 

而在閱讀:

is.read(&list2[0], size2 * sizeof(int)); 

更便攜(當您從32位編譯切換到64位爲例),你可能需要使用不會改變的數據類型。在這種情況下,請使用<cctype>的內容 - 例如int32_t爲大小和價值數據。

+0

這真的幫了我,謝謝。我有另一個問題,我需要投(char *)爲什麼我需要這樣做,如果我把它拿出來,它不會編譯。 此外,對於寫入和讀取對象,它將是相同的東西,只需替換 fout.write((char *)&size1,sizeof(size1)); ((char *)OBJVECTOR.data(),size1 * sizeof(OBJECTNAME)); 感謝您的幫助! – AvengedFenix

相關問題