我有一个名为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;
但是我更喜欢第一种方法。
答案 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);