Рассмотрим следующую простую программу, которая расщепляет вход на пробельных и печатает непробельных маркеры по одному в строке:Использование станд :: IStream :: часовому с станд :: IStream
#include <iostream>
int main(int argc, char* argv[])
{
while (std::cin)
{
std::string s;
std::cin >> s;
std::cout << "-" << s << "-\n";
}
return 0;
}
это работает штраф - за исключением того, что, так как входной поток указывает только EOF после мы попытались прочитать из нее, когда она достигает конца входного потока (^D
) он читает и выдает пустую строку:
[begin]
< a b c
> -a-
> -b-
> -c-
< (^D)
> --
[end]
Мы может справиться с этим, сделав выходную строку условной на !s.empty()
.
Однако есть еще один вариант. Мы можем заменить строку:
while (std::cin)
с:
while (std::istream::sentry(std::cin))
Караульного объект (который обычно используется внутри operator>>
) имеет эффект потребляющих пробелов и затем проверки для EOF или другого потока гласит:
[begin]
< a b c
> -a-
> -b-
> -c-
< (^D)
[end]
Мой вопрос состоит из трех частей:
- Есть ли причина, почему эта конструкция не будет работать должным образом?
- Является ли это уже идиоматическим?
- Если нет, то почему бы и нет?
Это изобретательный поворот в традиционном «почему мой цикл while (! Strm.eof()) не работает?» вопрос! Хотя, в конечном счете, ответ тот же. –