2010-10-24 3 views
1

Каков наилучший способ разобрать или перебрать istream? Мне нужно создать функцию, которая принимает istream, анализирует ее и создает объект, поэтому задавался вопросом самый простой способ сделать это. Даже то, что могло бы превратить его в string, было бы денди.C++ Iterate istream

ответ

4

Вы можете использовать istream_iterator.

typedef std::istream_iterator<std::string> streamiter; 
for (streamiter it = streamiter(some_istream); it != streamiter(); it++) { 
    // process words 
} 

Это разделит входной поток на все пробелы.

+0

Вы джентльмен и ученый. – Louis

1

Поскольку C++ не имеет встроенного отражения и настойчивости, вы не можете написать функцию, которая читает любой объект, а затем посмотреть, с чем он столкнулся. You необходимо знать, что вы ищете, прежде чем и прочитайте, что конкретно. (Конечно, вы всегда можете просто читать токены и подавать их в парсер.)

Если вы точно знаете, какой тип объекта читать из потока, часто бывает полезно дать этому классу конструктор, принимающий std::istream&. Поскольку обычно класс также содержит код для записи в поток, это ставит их обоих вместе, что лучше всего подходит для обслуживания. Затем код синтаксического анализа создает объект, передающий поток конструктору.

Если вы не знаете, с каким типом вы столкнетесь, вам придется написать (возможно, простую) функцию синтаксического анализа. Такие форматы должны начинаться с идентификатора, который сообщает, какой тип объектов следует. Ваша функция синтаксического анализа сначала должна будет прочитать этот идентификатор, а затем перейти в код, который считывает соответствующий тип из потока. Поскольку на данный момент он знает, какой тип объекта следует читать из потока, чтение реальных объектов может быть реализовано в конструкторах, как описано выше.