我不擅长IOstream库,因为我已经习惯了stdio和生活这个,但是我遇到了一个问题,我希望在IOstream中解决,但我发现它可能没有。所以我对标准C ++库很新,但对C ++ OOP / Classes等很好。
所以我不能使用像
这样的代码printf (stream, "...", C);
如果C是聚合类型,因为我无法创建新的格式字符串选项,如%mytupe。我也不能指望
的正确行为fwrite/fread (&C, sizeof(C), 1, stream)
如果T包含指针的字段,因为fwrite / fread将保存/加载指针的值,但不存储指针所指向的内存中的值:
class MyClass
{...
private:
{typename} Tp* Data;
} C;
我不太关心第一个限制,因为我可以编写一个将我的每个类的对象转换为文本字符串的函数,即使最后也不能轻易解决它。例如,我尝试创建一个将每个类保存为二进制文件的函数,但是我遇到了很多问题,比如模板的部分特化等运气员工(等等)。
在重写标准代码(比如自己的字符串和文件夹类)时厌倦了犯错误和错误,我希望学习(最后!)标准(由聪明的人和经过良好测试的:)库编写将帮助我我读了很多标准C ++库解决了使用流的第一个问题。我可以重载operator<<和运算符>>等等,以确保我的课程将被正确保存或从文本文件中读取。但是二进制文件对我来说更重要呢?
如果我想将像vector这样的类的对象保存到二进制文件中,我该怎么办?使用<<和>>完全失败,因为它说向量没有运算符<<和>>重载,但即使它有它会产生文本数据。
员工喜欢
vector <MyClass> V;
...
ofstream file ("file.bin", ios::binary);
int size1 = ;
file.write((const char*)&V.size(), sizeof(V.size()));
file.write((const char*)&V[0], V.size() * sizeof(MyClass));
不合适(并且与fwrite的使用没有多大区别),因为它保存了指针字段的值(地址)而不是存储在那里的数据(如果我将“二维”向量声明为向量,该怎么办? &gt; ??)。因此,如果向量运算符的重载&lt;&lt;像
template <class T> vector
{public:
...
ostream operator << () const
{ostream s;
for (uint32_t k = 0; k < size(); k++)
s << s << this->operator[] (k);
return s;
}
private:
T* Data;
};
并且如果每个T ::运算符&lt;&lt;也以同样的方式重载(对于MyClass - 提供存储在MyCLass :: Tp中的数据流)它被保存了。
(我知道,我知道,应该有迭代器,但是由于对流的完全误解,我可能犯了一个更严重的错误?无论如何我只是在谈论想法。)
嗯,这是一种将数据转换为文本的方法,而不是存储在内存中的二进制数据,但我知道可以用相同的方式编写一个用于处理二进制数据的接口(可能不使用&lt; ;&lt;和&gt;&gt;但函数名称,但它可以肯定)!任务是:它是在标准C ++库或其他地方完成的(C ++的另一个开源库)?是的,是的,在一行中正确地将向量写入文件。 (如果它不包含在标准C ++中,我会非常惊讶,因为如果他们想要使用多维动态数组,人们如何将他们工作的数据保存到文件中?)