将'3d'矢量pod类型写入二进制文件c ++

时间:2016-07-25 18:49:03

标签: c++ vector binary

我制作了以下示例代码(使用-std = c ++ 11编译)

这是一个10 * 20 * 30的3d矢量,到处都是数字8。 我无法弄清楚如何将其写入磁盘并将其读回。有人能告诉我如何请求或完成r-rw例程吗?

#include <iostream>
#include <vector>
#include <fstream>

int main(int argc, char *argv[])
{
    //'3d' vector filled with 8's
    std::vector<std::vector<std::vector<int>>>  all8s (10,std::vector<std::vector<int>>(20,std::vector <int>(30,8)));;
    //print the whole
    std::cout << "1st size " << all8s.size() << " \n";
    for ( auto& elemTop : all8s ) {
        std::cout << "2nd size " << elemTop.size() << " \n";
        for ( auto& elemMiddle : elemTop ) {
            std::cout << "3th size " << elemMiddle.size() << "  \n";
            for ( auto& elemBottom : elemMiddle ){
                std::cout << elemBottom << ",";
            }
            std::cout << "\n";
        }
    }

    //write binary file
    std::ofstream out("all8s.bin", std::ios::out | std::ios::binary);
    //how do I write this to disk
    out.close();

    //read it?
    std::vector<std::vector<std::vector<int>>>  all8sReloaded;
    std::ifstream in("all8s.bin", std::ios::in | std::ios::binary);
    //how to read it back?
    in.close();
}

2 个答案:

答案 0 :(得分:1)

无法在一个写句中写入所有块。根据您的代码,一个非常简单的解决方案是:

for ( auto& elemTop : all8s )
        for ( auto& elemMiddle : elemTop )
            for ( auto& elemBottom : elemMiddle )
                cout.write (reinterpret_cast(const char*)&elemBottom, sizeof(int));

另一方面,如果你想阅读它们,你需要知道你的向量的大小;它很相似。如果没有,则必须在数据之前保存此大小。

答案 1 :(得分:1)

两种嵌套循环是一种可能的方式,然后写入,例如&all8s[i][j][0](与all8s[i][j].data()相同)。请注意,我使用向量索引作为示例,您可以使用迭代器或基于范围的for循环,就像您已经在使用它一样。

如果您已经知道尺寸,那么阅读很容易。您可以将大小设置为编译时固定大小,就像您的示例all8s一样,或者您可以将文件中的大小(维度)保存为数据前的标题。无论你如何获得大小,你都需要resize向量,并且基本上和你编写它一样阅读它。

或者只使用已经内置了大部分功能的serialization library