如何在c ++中将整个数组保存到磁盘

时间:2011-04-28 13:39:24

标签: c++ serialization

我一直在寻找,但我从来没有能够在二维数组中保存除一个坐标以外的任何东西

5 个答案:

答案 0 :(得分:2)

这称为serialization。有关使用Boost执行此操作的详细信息,请查看this question

答案 1 :(得分:2)

基于StackedCrooked's idea,这里有一个解决方案,允许您使用std::vector的C样式数组或其元素为其定义<<的任何其他序列。

#include <cstddef>
#include <fstream>
#include <iostream>


// Beware, brain-compiled code ahead! 
template<class InpIt>
void save_seq(const std::ostream& os, InpIt begin, InpIt end)
{
    if(begin != end)
        os << *begin++;
    while(begin != end)
        os << ' ' << *begin++;
}

template<class OutpIt>
bool load_seq(const std::istream& is, OutpIt begin, std::size_t n)
{
    for( std::size_t i=0; is && i<n; ++i)
        is >> *begin++
    return is.good() || is.eof();
}
template<class OutpIt>
bool load_seq(const std::istream& is, OutpIt begin)
{
    while(is.good())
        is >> *begin++
    return is.eof();
}

template<class T, std::size_t N>
void save_array(const std::ostream& os, const T (&data)[N])
{
    save_seq(os, data, data+N);
}


template<class T, std::size_t N>
bool load_array(const std::istream& is, T (&data)[N])
{
    return load_seq(is, data, N);
}

int main()
{
    const std::size_t size = 5;
    int numbers[size];
    numbers[0] = 10;
    numbers[1] = 11;
    numbers[2] = 12;
    numbers[3] = 13;
    numbers[4] = 14;
    {
        std::oftsream ofs("array.txt");
        if(!ofs.good())
            return 1;
        save_array(ofs, numbers);
    }
    {
        std::iftsream ifs("array.txt");
        if(!ifs.good())
            return 2;
        int test[size];
        load_array(ifs, test);
        for (std::size_t idx = 0; idx < size; ++idx)
            std::cout << "test[" << idx << "]: " << test[idx] << std::endl;
    }

    std::vector<int> numbers2;
    numbers2.push_back(20);
    numbers2.push_back(21);
    numbers2.push_back(22);
    numbers2.push_back(23);
    {
        std::oftsream ofs("array.txt");
        if(!ofs.good())
            return 1;
        save_Seq(ofs, numbers2.begin(), numbers2.end());
    }
    {
        std::iftsream ifs("array.txt");
        if(!ifs.good())
            return 2;
        std::vector<int> test;
        load_seq(ifs, std::back_inserter(test));
        for (std::size_t idx = 0; idx < numbers2.size(); ++idx)
            std::cout << "test[" << idx << "]: " << test[idx] << std::endl;
    }

    return 0;
}

答案 2 :(得分:1)

您可以使用std :: fstream或boost :: serialization。你的问题有点模糊,所以我不完全确定你想要什么,需要吗?

答案 3 :(得分:0)

如果数组包含 flat 数据(,即不包含指向其他数据的指针的数据),则可以在一次写入文件时写入整个数组

不知道你的数据是什么样子,就不可能多说一些。

答案 4 :(得分:0)

经过一些修修补补后,我想出了这个:

#include <cstddef>
#include <fstream>
#include <iostream>


template<class T>
void SaveArray(const std::string & file, T * data, std::size_t length)
{
    std::ofstream out(file.c_str());
    for (std::size_t idx = 0; idx < length; ++idx)
    {
        if (idx != 0)
        {
            out << " ";
        }
        out << *data++;
    }
}


template<class T>
std::size_t LoadArray(const std::string & file, T * data, std::size_t length)
{
    std::ifstream in(file.c_str());
    std::size_t count = 0;
    while (count++ < length && in >> *data++);
    return count - 1; // return number of items
}


int main()
{
    int numbers[5];
    numbers[0] = 10;
    numbers[1] = 11;
    numbers[2] = 12;
    numbers[3] = 13;
    numbers[4] = 14;
    SaveArray("array.txt", &numbers[0], 5);

    int test[5];
    LoadArray("array.txt", &test[0], 5);

    for (std::size_t idx = 0; idx < 5; ++idx)
    {
        std::cout << "test[" << idx << "]: " << test[idx] << std::endl;
    }
    return 0;
}

欢迎提出改进建议。