0

入力ストリームが無効な場合はどうなりますか? たとえば、次のようになります。

int main()
{
    int value;
    while(!(cin>>value).eof());
}

入力されたシーケンスが 1 2 3 q 4 5 の場合、cin が 'q' をスキャンし、値が 3 のままになると、while は無限ループに陥ります。スキャン 4 に進みますか? 2. 入力ストリームの基本的な実装は何ですか? 参考になる資料はありますか?

ありがとうございました!

4

1 に答える 1

3
  1. 「q」を無視してスキャン 4 に進むことができないのはなぜですか?

必要に応じてできます。次の方法でその効果を得ることができます。

int value;
while(std::cin>>value);
if (!std::cin)
{
    std::cin.clear(); // clear error state
    std::cin.ignore(); // ignore the q
    while(std::cin>>value); // read rest of values until 5
}

std::cin >> value必要な動作はプログラムによって異なるため、デフォルトではそれを行いません。std::cin多くの人にとって、読み取りの失敗を無視してスキャンを続けることは望ましくありません。デフォルトの動作では、プログラマーが失敗時の対処方法を決定できます。

また、ファイルの終わりeof()をチェックするためのものであることに注意してください。読み取りが成功したかどうかを確認するために使用しないでください。一般的なイディオムは次のとおりです。

while(std::cin>>value)
{
    // Do stuff
}
  1. 入力ストリームの基本的な実装は何ですか? 参考になる資料はありますか?

std::cinグローバルな静的オブジェクトであり、次のように定義されています。

extern std::istream cin;

言い換えれば、それはstd::basic_istream<char>(std::istream はその typedef です) のインスタンスです。

さらに詳しい情報が必要な場合は、次の参考文献を参照してください。

http://en.cppreference.com/w/cpp/io/cin

https://github.com/cplusplus/draft

ただし、優れた C++ の本が役立つ可能性が高いでしょう。

iostream を深く掘り下げたい場合は、これらの記事もお勧めします。

于 2013-10-29T03:30:01.913 に答える