Пользовательский конечный итератор istream - PullRequest
0 голосов
/ 03 марта 2019

Я хочу прочитать одну строку текста из istream и разбить ее на слова.Мой текущий код -

vector<string>((istream_iterator<string>(f)),
                                istream_iterator<string>());

, где f - объект ifstream.Однако, это читает до конца файла, и я хочу, чтобы он не читал, когда он достигает новой строки.Есть ли способ сделать что-то вроде istream_iterator<string>("\n"), чтобы векторный конструктор перестал возвращаться, когда достигнет новой строки?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Используйте std::getline() для чтения одной строки, а затем используйте std::istringstream для чтения слов из этой строки, например:

std::string line;
std::getline(f, line);
std::istringstream iss(line);
std::vector<std::string> words(
    std::istream_iterator<std::string>(iss),
    std::istream_iterator<std::string>()
);
0 голосов
/ 03 марта 2019

Используйте std::getline, чтобы прочитать каждую строку и поместить их в свой контейнер результатов.

std::vector<std::string> lines;
for (std::string line; std::getline(f, line); lines.push_back(line));

Редактировать: Реми Лебо уже ответил на вопрос ОП, я хочу уточнить свой код:

Обычно для чтения строк в файле мы пишем что-то вроде

while (f.good())
{
    std::string line;
    std::getline(f, line);
    lines.push_back(line);
}

Поскольку std::istream можно преобразовать в логическое значение , мы можем переписать его как:

while (f)
{
    std::string line;
    std::getline(f, line);
    lines.push_back(line);
}

И поскольку std::getline возвращает сам входной поток , мы можем использовать его в качестве условия цикла:

std::string line;
while (std::getline(f, line))
{
    lines.push_back(line);
} // `line` still can be used after this line, outside its scope

Но мы должны вытащить временную переменную line наружусвоей области.Чтобы избежать этого, мы используем for вместо while цикла и объявляем line внутри for цикла:

for (std::string line; std::getline(f, line); )
{
    lines.push_back(line);
}

Наконец, поскольку тело цикла содержит только 1 строку, мы можемпоместите его внутрь for петли тоже:

for (std::string line; std::getline(f, line); lines.push_back(line));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...