我正在使用ifstream和ostream序列化我的数据,但我很惊讶发现`<<<操作员不能分开两个相邻的琴弦并将它们分开会很复杂。
class Name
{
string first_name;
string last name;
friend std::ostream& operator<< (std::ostream& os, const Name& _name)
{
os << _name.first_name << _name.last_name;
return os;
}
friend std::istream& operator>> (std::istream& is, Name& _name)
{
is >> _name.first_name >> _name.last_name;
return is;
}
这不起作用,因为&lt;&lt;和&gt;&gt;不写空终止符字符,ifstream读取变量(first_name)中的整个字符串,这有点令人失望。如何单独存储两个字符串,以便我也可以单独阅读它们?我不明白<<
连接ostream中所有字符串的动机是什么,所以我们不能单独阅读它们??
答案 0 :(得分:2)
我不明白&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;连接ostream中的所有字符串,这样我们就无法单独阅读它们了??
这假设仅分别编写它们的原因是将它们作为单独的字符串读取。考虑某人有一对他们想要写入流而没有分隔符的字符串的情况。或者是一个后跟浮点数的字符串,它们不需要分隔符。
如果ostream
为每个<<
输出自动插入分隔符,那么有人在没有分隔符的情况下编写文本会更加困难。他们必须手动将这些字符串和/或值连接成一个字符串,然后输出。
他们将用于此连接的内容是什么?他们不能像您通常那样使用ostringstream
,因为它使用与ofstream
相同的功能。因此,每个<<
都会在流中添加一个分隔符。
简而言之,IO流API会将您告诉它写入的内容写入,而不是您可能或不想“写”的内容。它不是序列化API; C ++不是C#或Java。如果您需要严格的序列化功能,请使用Boost.Serialization。
答案 1 :(得分:1)
通常,您希望将字符串与ostream
(通常为stringstream
)连接起来。如果您特别不希望它们连接起来,那么很容易做到:
os << _name.first_name << '\n' << _name.last_name;
答案 2 :(得分:1)
ifstream
和ofstream
基本上都是流,因此它们没有任何内容表明其中的数据限制。将它们视为河流,所有数据都可以读取或写入它们。这是文件的真实性质,因此如果您需要它们进行序列化,则必须实现序列化机制或使用为此目的设计的库,如boost::serialization
。在C ++中,每个东西都按原样实现,因此你可以获得最大的性能! :)