std :: cin ::以及为什么换行仍然存在

时间:2013-04-09 14:40:29

标签: c++ newline cin

参考Why is the Console Closing after I've included cin.get()?

我正在使用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::sentrystd::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

2 个答案:

答案 0 :(得分: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;
}

为它提供一个由单个字符和换行符组成的文件(“a \ n”),输出为:

y->a<-
z->
<-

答案 1 :(得分:0)

这很简单。例如,如果您想在阅读时编写包含城市名称的文件,则不希望使用换行符读取名称。 除了'\ n'和其他任何一个字符一样好,并且使用cin你只是取一个字符所以它为什么要跳过任何东西? 在大多数用例中,当你通过char读取char时,你不想跳过任何字符,因为可能你想以某种方式解析它,当你读取字符串时你不关心空格等等。