用C ++将数组保存到文件

时间:2018-06-23 19:04:26

标签: c++

我有一个名为Array的自定义类。它存储类型T和大小整数的数组。

将数组保存到文件看起来正确吗?

fout.write((char *)m_array, sizeof(T) * m_size);

我如何存储它:

    bool save(const std::string &filename)
    {
        std::ofstream fout;

        // Open the file.
        fout.open(filename, std::ios::out | std::ios::binary);

        // Validate that the file is open.
        if (!fout.is_open())
            return false;

        // Write the size to file.
        fout << m_size << std::endl;  

        fout.write((char *)m_array, sizeof(T) * m_size);

        fout.close();

        return true;
    }

加载功能:

    bool load(const std::string &filename)
    {
        std::ifstream fin;
        int size = 0;

        // Open the file.
        fin.open(filename, std::ios::in | std::ios::binary);

        // Validate that the file is open.
        if (!fin.is_open())
            return false;

        // Read the size from file.
        fin >> size;

        // Resize if needed
        if (size != m_size)
            resize(size); 

        fin.read((char *)m_array, sizeof(T) * m_size);

        fin.close();

        return true;
    }

主文件:

Array<int> a(10);

a.clear(); // set all values to 0. 

a[5] = 3; 

if (a.save("test.dat"))
    con.writeLine("Saved");

给出输出值0,0,0,0,0,0,3,0,0,0。

但是在检索时,使用以下方法:

fin.read((char *)m_array, sizeof(T) * m_size);

我得到10,0,0,0,0,768,0,0,0,0。

我在做什么错?第二个参数说它想要计数,对我来说是sizeof(T)* m_size。

更新: 另一种选择是保存:

for (int i = 0; i < m_size; i++)
fout << m_array[i] << std::endl;

但是我更喜欢第一种方法。

1 个答案:

答案 0 :(得分:3)

您正在将格式化和未格式化的写入混合到流中。而不是:

fout << m_size << std::endl;

您需要这样做:

fout.write(reinterpret_cast<char*>(&m_size), sizeof(m_size));

编辑:
看到您正在更新之后,您需要阅读,而无需阅读以下内容:

fin >> size;

但是,这个:

fin.read(reinterpret_cast<char*>(&m_size), sizeof(m_size));

因此在这里应该提到您正在重新发明轮子。只要您对此表示满意,不过我认为在这里建议使用vector<T>是合适的。这样可以使您的代码更具可读性,减少出错的可能性,并有可能更快。

给出vector<int> a,您可以像这样写到ofstream fout

const auto a_size = size(a);

fout.write(reinterpret_cast<const char*>(&a_size), sizeof(a_size));
fout.write(reinterpret_cast<const char*>(data(a)), sizeof(decltype(a)::value_type) * a_size);

给出ifstream fin,您可以这样阅读:

size_t a_size;

fin.read(reinterpret_cast<char*>(&a_size), sizeof(a_size));
a.resize(a_size);
fin.read(reinterpret_cast<char*>(data(a)), sizeof(decltype(a)::value_type) * a_size);

Live Example