5

参照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 ループが 2 回実行されるため、代わりに使用することにしました。

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

上記の回答の1つに記載されている参照として、std::cin文字を読み取るためにstd::cin::get使用され、改行を削除するために使用されます\n

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

私の質問は、なぜストリームstd::cinに改行を残すのですか?\n

4

2 に答える 2

4

これはデフォルトの動作ですが、変更することができます。これを試して:

#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->
<-
于 2013-04-09T14:55:19.547 に答える
0

とてもシンプルです。たとえば、ファイルを読み取るときに保存された都市名を含むファイルを書きたい場合、改行文字を含む名前を読みたくないでしょう。その上、「\n」は他の文字と同じくらい優れた文字であり、cin を使用することで 1 つの文字をフェッチするだけなので、なぜ何かをスキップする必要があるのでしょうか? 文字を 1 文字ずつ読み取る場合のほとんどのユースケースでは、おそらく何らかの方法で解析したいため、文字をスキップしたくありません。文字列を読み取る場合、空白などは気にしません。

于 2013-04-09T14:56:37.093 に答える