2013-09-22 6 views
0

Я пытаюсь узнать что-то, основываясь на ресурсе Java, и я хочу адаптировать его к C++.Что такое эквивалент C++ Java StdIn.isEmpty()

Источник Java имеет:

while(!StdIn.isEmpty()) 
{ 
    //Take input from standard input, and process it... 
} 

В C++ ближайший решение, которое я мог придумать было

while(cin >> someString) 
{ 
    //process someString... 
} 

Однако, проблема в том, что CIN возвращает состояние объекта. Я не могу вставить неправильный ввод в std :: string. Это могло бы работать для int, но не для строки. Любая эквивалентная функция или обходные пути?

Заранее спасибо.

+0

Конечно, вы можете. Попробуйте ввести EOF. – chris

+0

Непонятно, по крайней мере, для меня, что вы пытаетесь сделать. –

+2

В стандартном Java API нет класса 'StdIn'. Что ты пытаешься сделать? – Joni

ответ

2

С iostreams C++, а также с STDIO C, вы не можете сказать, является ли файл (например, std::cin/stdin) будет пустым, если бы вы попробовали чтение из него. Единственный способ узнать - на самом деле читать из файла, а затем проверить, была ли попытка выполнена.

(Да, вы можете использовать некоторые формы peek, но нигде не рядом, как идиоматические или непрактично.)

Так стандартный метод в C++ может выглядеть следующим образом, обработка целых строк ввода в то время:

for (std::string line; std::getline(std::cin, line);) 
{ 
    // process "line" 
} 

тело цикла будет выполняться только если вам удалось на извлечение одной строки из входных данных. Как только вход заканчивается из данных, условие цикла больше не выполняется (т. Е. Поток больше не «хорош»), и цикл останавливается.

Та же идея относится к Кассиопеяне fgets, а также бесформатному std::istream::read() и fread и функциям для конкретных платформ, как Posix-х read(2): Вы всегда попытку получить вход, то проверка получили ли вы какой-либо вход, и только если вы это сделаете, вы начнете потреблять входные данные.

+0

Hey Kerrek, спасибо за ответ. Вы уверены, что ваш код будет работать? Для меня (GCC 4.8.1) он всегда работает. Если я нажимаю кнопку ввода, он все равно продолжается (строка пуста, похоже, что она действительна). Или, может быть, я понимаю, что все это неправильно? – MatthewRock

+0

@MatthewRock: Большое непонимание того, что такое «стандартный ввод»: Enter просто создает новую строку, она не закрывает стандартный ввод. Читатель просто блокирует, ожидая большего. Чтобы закрыть стандартный ввод, вам нужно сделать что-то еще, например, нажать Ctrl-D или не читать с консоли, а перенаправить: 'echo" abc "| ./a.out' –

+0

Отлично. Спасибо за ответ. Я боялся, что это вариант. – MatthewRock

Смежные вопросы