1

我正在使用 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;
}

这不起作用,因为 << 和 >> 不写入空终止符,并且 ifstream 读取变量 (first_name) 中的整个字符串,这有点令人失望。如何分别存储这两个字符串,以便我也可以分别读取它们?我不明白<<在 ostream 中连接所有字符串的动机是什么,所以我们不能单独读回它们!?

4

3 回答 3

2

我不明白 << 连接 ostream 中所有字符串的动机是什么,所以我们不能单独读回它们!?

这假设单独编写它们的唯一原因是将它们作为单独的字符串读取。考虑这样一种情况,有人有一对字符串,他们想在没有分隔符的情况下写入流。或者一个字符串,后跟一个他们不想要分隔符的浮点数。

如果ostreams 自动为每个<<输出插入分隔符,那么某人编写没有分隔符的文本会困难得多。他们必须手动将这些字符串和/或值连接成一个字符串,然后输出。

他们将使用什么来连接?它们不能ostringstream像您通常那样使用,因为它使用与ofstream. 所以每个<<人都会在流中放置一个分隔符。

简而言之,IO 流 API 写的是您告诉它写的内容,而不是您可能“想要”或不想写的内容。它不是序列化 API;C++ 不是 C# 或 Java。如果您想要严肃的序列化功能,请使用Boost.Serialization

于 2012-10-12T21:15:29.367 回答
1

很多时候你想用ostream(commonly stringstream) 连接字符串。如果您特别不希望将它们连接起来,那么很容易做到:

os << _name.first_name << '\n' << _name.last_name;

于 2012-10-12T20:44:55.070 回答
1

ifstream并且ofstream基本上是流,因此它们没有任何迹象表明其中的数据限制。将它们想象成一条河流,所有数据都可以读取或写入它们。这是文件的真实性质,因此如果您需要它们进行序列化,则必须实现序列化机制或使用为此目的设计的库,例如boost::serialization. 在 C++ 中,每件事都按原样实现,因此您可以获得最大的性能!:)

于 2012-10-12T21:20:54.713 回答