2013-08-16 3 views
1

Есть ли какое-то идиоматическое выражение с использованием C++ iostream библиотеки, которая похожа на идиомы"а (с = GetChar())" эквивалент в C++

while (c = getchar()) 

в C?

примечание: я оставил оператор просто «c = getchar()», чтобы он стал более общим. В реальном коде я бы сравнил результат этого с чем-то другим, например с EOF или новой линией.

+6

'while (std :: cin >> c)'. – Rapptz

+2

@Rapptz: вы забыли 'std :: cin >> std :: noskipws' –

+0

@MooingDuck Упс, да. – Rapptz

ответ

9
#include <iostream> 

int main() { 
    char c; 
    std::cin >> std::noskipws; 
    while(std::cin >> c) { 
     std::cout << c << std::endl; 
    } 
} 
+0

'noskipws' является липким и его не нужно устанавливать каждый раз. Кроме того, обработка подпрограмм форматирования (с отключенным форматированием) тратит время. Используйте 'std :: cin.get (c)'. – Potatoswatter

+0

@Potatoswatter Обновлено! – andre

6

Ближайший эквивалент GetChar() является std::istream::get():

while ((c = std::cin.get())) 

Обратите внимание на двойные скобки; они используются, чтобы избежать предупреждения компилятора об использовании = вместо == в состоянии цикла.

+0

wait, я только что заметил, ЭТО КОД НЕПРАВИЛЬНО! O.o Полностью не заметил, что условие выхода цикла на 100% неправильно первое, как 3 раза, я прочитал этот ответ. (protip: 'while (std :: cin.get (c))') –

+0

@MooingDuck Как это неправильно? Я использую перегрузку istream :: get(), которая возвращает прочитанный символ или EOF. Это то же самое семантика, что и getchar(). Я даже связан с документами cplusplus.com istream :: get(), где вы можете увидеть различные перегрузки. Тот, который я использую, - это тот, который помечен как «(1) одиночный символ». Код OP 'while (c = getchar())' переводит * точно * в 'while (c = std :: cin.get())', с той же семантикой. –

+0

В ходе дальнейшего обзора вы правы, он точно выполняет перевод, и ошибка, которую я видел, является _also_ в коде OP. Виноват. Я сделаю крошечное редактирование сообщения, чтобы я мог удалить downvote. –

0

примечание: я оставил заявление на просто «с = GetChar()», чтобы позволить ему быть более универсальным. В реальном коде я бы сравнил результат этого с чем-то другим, например с EOF или новой линией.

Ум, то есть нет общий. Если это универсальная версия чего-либо, она в общем выражает общую ошибку. Все программное обеспечение должно обрабатывать условие EOF в любом месте.

В C++ мы используем потоковые буферы, которые сравниваются с истинными или ложными значениями в зависимости от успеха. Нет необходимости использовать EOF в качестве значения фальшивого потока, хотя вы можете это сделать.

идиома (без ошибка) будет

while (std::cin.get(c)) 

Если вы хотите, чтобы потреблять до следующего символа новой строки и разобрать одну строку на итерации, без требования, чтобы закончить файл с пустой строкой, а затем использовать

std::string s; 
while (getline(std::cin, s)) { 
    std::istringstream line(s); 

Затем вы можете извлекать предметы, используя line >> x.