解析或迭代istream
的最佳方法是什么?我需要创建一个带istream
的函数,解析它并创建一个对象,所以想知道最简单的方法。即使可以将其转换为string
的东西也会花哨。
答案 0 :(得分:5)
您可以使用istream_iterator
。
typedef std::istream_iterator<std::string> streamiter;
for (streamiter it = streamiter(some_istream); it != streamiter(); it++) {
// process words
}
这将在所有空格中分割输入流。
答案 1 :(得分:1)
由于C ++没有内置的反射和持久性,你不能编写一个读取任何对象的函数,然后看看它是什么。您 需要事先知道您要查找的内容 并具体阅读。 (当然,您可以随时阅读令牌并将其提供给解析器。)
如果您确切知道要从流中读取哪种类型的对象,那么为该类提供一个std::istream&
的构造函数通常会很好。由于通常类也是写入流的代码的位置,因此将它们放在一起,这最适合维护。然后,解析代码只创建将流传递给构造函数的对象。
如果您不知道将遇到哪种类型,则必须编写一个(可能很简单的)解析函数。这种格式应该以一个标识符开头,该标识符告诉哪些类型的对象。您的解析函数首先必须读取该标识符,然后分支到从流中读取适当类型的代码。由于此时它知道从流中读取什么类型的对象,因此可以在构造器中实现读取实际对象,如上所述。