2013-04-09 2 views
1

Ссылка Why is the Console Closing after I've included cin.get()?станд :: CIN :: и почему новая строка остается

Я с использованием std::cin.get()

#include<iostream>  

char decision = ' '; 
bool wrong = true; 

while (wrong) { 
    std::cout << "\n(I)nteractive or (B)atch Session?: "; 

    if(std::cin) { 
     decision = std::cin.get(); 

     if(std::cin.eof()) 
      throw CustomException("Error occurred while reading input\n"); 
    } else { 
     throw CustomException("Error occurred while reading input\n"); 
    } 

    decision = std::tolower(decision); 
    if (decision != 'i' && decision != 'b') 
     std::cout << "\nPlease enter an 'I' or 'B'\n"; 
    else 
     wrong = false; 
} 

Я прочитал basic_istream::sentry и std::cin::get.

Я выбрал вместо этого использовать std::getline, поскольку цикл while выполняется дважды, потому что поток не пуст.

std::string line; std::getline(std::cin, line); 

В ссылке я опубликовал выше состояние в одном из ответов, std::cin используется для чтения символа и std::cin::get используются для удаления символа новой строки \n.

char x; std::cin >> x; std::cin.get(); 

Мой вопрос почему std::cin оставить строку \n на поток?

+1

Зачем читать больше, чем нужно? – chris

+0

В C++ I/O является абстрактным. Концепции консоли нет, и все операции ввода-вывода проходят через один и тот же базовый код. Если вы читали файл, вы не ожидали, что операции ввода-вывода будут линейными, вы ожидаете, что операция ввода-вывода будет читать то, что им нужно, и не более того. То же самое можно сказать и о консольных вводах-выводах. – john

+1

Возможный дубликат [Почему команда cin оставляет «\ n» в буфере?] (Http://stackoverflow.com/questions/28109679/why-does-cin-command-leaves-an-in-the-buffer) –

ответ

1

Потому что это его поведение по умолчанию, но you can change it. Попробуйте это:

#include<iostream> 
using namespace std; 

int main(int argc, char * argv[]) { 
    char y, z; 
    cin >> y; 
    cin >> noskipws >> z; 

    cout << "y->" << y << "<-" << endl; 
    cout << "z->" << z << "<-" << endl; 
} 

Кормление это файл, состоящий из одного символа и символ новой строки («а \ п»), выход:

y->a<- 
z-> 
<- 
0

Это довольно просто. Например, если вы хотите записать файл с сохраненными названиями городов при чтении, вы не захотите читать имена с символами новой строки. Кроме того, '\ n' - это символ, отличный от любого другого, и, используя cin, вы просто выбираете одного символа, так зачем ему пропускать что-либо? В большинстве случаев использования при чтении символа char вы не хотите пропускать любой символ, потому что, возможно, вы его каким-то образом разбираете. При чтении строки вам не нужны белые пробелы и т. Д.

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