2009-11-13 1 views
1

Должна быть причина для префикса getline или istream_iterator, если вы выполняете линейный ввод из файла (чтение строки в строку, для токенизации).getline vs istream_iterator

+2

Вы вроде ответил себе на вопрос - используйте 'getline', чтобы получить строка или 'istream_iterator' для токенизации. –

ответ

11

я иногда (в зависимости от ситуации) написать класс строки, так что я могу использовать istream_iterator:

#include <string> 
#include <vector> 
#include <iterator> 
#include <iostream> 
#include <algorithm> 

struct Line 
{ 
    std::string lineData; 

    operator std::string() const 
    { 
     return lineData; 
    } 
}; 
std::istream& operator>>(std::istream& str,Line& data) 
{ 
    std::getline(str,data.lineData); 
    return str; 
} 

int main() 
{ 
    std::vector<std::string> lines; 
    std::copy(std::istream_iterator<Line>(std::cin), 
       std::istream_iterator<Line>(), 
       std::back_inserter(lines) 
      ); 
} 
6

getline доставит вам всю строку, тогда как istream_iterator<std::string> предоставит вам отдельные слова (разделенные пробелами).

Зависит от того, что вы пытаетесь выполнить, если вы спрашиваете, что лучше (токенизация - всего лишь один бит, например, если вы ожидаете хорошо сформированную программу, и вы ожидаете ее интерпретировать, возможно, лучше читать целые строки ...)

+0

Извините, я должен был добавить, что линия разделена запятой. так что istream_iterator действительно получит всю строку. – Pradyot

+0

Если вы не ожидаете, что ввод будет искаженным _EVER_, что сложно сказать, да, вы получите целую строку. – dirkgently

+0

Каждая ячейка на линии также не должна содержать пробелов. –