C ++ Итерирование istream - PullRequest
       13

C ++ Итерирование istream

1 голос
/ 24 октября 2010

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

Ответы [ 2 ]

5 голосов
/ 24 октября 2010

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

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

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

1 голос
/ 24 октября 2010

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

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

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

...