2017-03-09 120 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