cin.eof()
がストリーム形式をテストすることを理解しています。また、入力中に文字の終わりが入力に誤りがあると到達しません。私はMSV C++ 201でこれをテストしましたが、奇妙な結果を理解していません。入力内容に関係なく、プログラムにFormat Errorメッセージが表示されます。
#include <iostream>
using namespace std;
int main()
{
int i;
cin>> i;
if(!cin.eof())
{
cout<< "\n Format Error \n";
}
else
{
cout<< "\n Correct Input \n";
}
getchar();
return 0;
}
私が期待した結果:
Iの値=
誰かが私がどこで間違っているのか説明してくれませんか。ありがとう。
std::cin.eof()
はend-of-file(したがってeof)をテストしますが、エラーはテストしません。エラーチェックには、!std::cin.good()
、組み込みの変換演算子(if(std::cin)
)、またはブール否定演算子(if(!std::cin)
)を使用します。
ストリームのステータスの直接テストを使用して:
while (cin >> i)
{
...
}
入力ストリームがEOF状態に入るには、実際に試行する必要がありますストリームの終わりを超えて読み取る。つまり、終わりに到達するには十分ではありません-ストリーム内のストリームの場所を特定するには、実際に文字列の末尾を超えてreadを試行する必要があります。この試行により、EOF状態がアクティブになります。 turnはcin.eof()
をtrueに戻します。
しかし、あなたの場合、あなたはそれをしているだけではなく、あなたは(おそらく)ストリームの終わりに達していません。キーボードから_10
_を入力した場合は、[Enter]キーを押して入力を完了した可能性があります。これにより、入力ストリームに改行文字が追加されました。したがって、この場合に実際に_>>
_演算子で解析しているのは、実際には_10\n
_シーケンスです。ストリームからint
値を要求したため、ストリームから数値文字のみを読み取ります。つまり、_1
_と_0
_を読み取りますが、_\n
_で停止します。その_\n
_はストリームに残ります。あなたはそれを決して読まない。したがって、明らかに、コードがストリームのファイルの終わりに到達することはありません。そのような場合、cin.eof()
がtrue
になることを期待する必要があります。
入力が行ベースであると想定して、std::getline()
を使用して行全体を読み取ることをお勧めします。ラインを取得したら、それを分析して、正しい入力と間違った入力のどちらが含まれているかを判断できます。行を_std::istringstream
_に入れて、次のようなことを行います。
編集: C++ 0xとの互換性のために_!! iss
_をstatic_cast<bool>(iss)
に変更しました。
_std::istringstream iss (line);
char ch;
long lval;
// read the input
iss >> lval;
// result variable will contain true if the input was correct and false otherwise
result
// check that we have read a number of at least one digit length
= static_cast<bool>(iss)
// check that we cannot read anything beyond the value read above
&& ! (iss >> ch);
_
#include <iostream>
int main() {
using namespace std;
int i;
if (cin >> i) {
cout << "Extracted an int, but it is unknown if more input exists.\n";
char c;
if (cin.get(c)) { // Or: cin >> c, depending on how you want to handle whitespace.
cin.putback(c);
cout << "More input exists.\n";
if (c == '\n') { // Doesn't work if you use cin >> c above.
cout << "But this was at the end of this line.\n";
}
}
else {
cout << "No more input exists.\n";
}
}
else {
cout << "Format error.\n";
}
return 0;
}
testing stream.good()または!stream.eof()が最後の行を2回読み取る も参照してください。
上記のプログラムを使用したサンプルセッション。入力行には、実際の出力には存在しないコメントが付いていることに注意してください。
$ your-program
12 # input
Extracted an int, but it is unknown if more input exists.
More input exists.
But this was at the end of this line.
$ your-program
12a # input
Extracted an int, but it is unknown if more input exists.
More input exists.
$ echo -n 12 | your-program
Extracted an int, but it is unknown if more input exists.
No more input exists.
$ your-program
a # input
Format error.
前の回答への追加:入力(10など)を読んだ後は、簡単にさらに入力できるため、ファイルの終わりにはいません。システムはあなたがそうしないことをどのようにして知るのですか?
2番目の入力(12a)を読み取ると、整数の一部になる可能性のあるすべての桁が正しく読み取られます。文字「a」は使用できないため、後で入力するために残されています。たとえば、このコードで12aのすべての部分を読み取ることができます
int i; char c;
cin >> i >> c;
cin.eof()
Ctrl + C(Windowsの場合)などを入力した場合にストリームがファイルの終わりに達したかどうか、または入力がファイルにリダイレクトされたかどうかなどをテストします。
入力に整数が含まれていて整数のみが含まれているかどうかをテストするには、まず文字列に入力を取得し、それを文字列ストリームで変換します。文字列ストリームから抽出する必要がなくなった場合、文字列ストリームは実際にeofに到達します。
#include <iostream>
#include <sstream>
#include <string>
int main() {
using namespace std;
int i;
string input;
cin >> input; //or getline(cin, input)
stringstream ss(input);
if (ss >> i && ss.eof()) { //if conversion succeeds and there's no more to get
cout<< "\n Correct Input \n";
}
else {
cout<< "\n Format Error \n";
}
return 0;
}
EOFはe nd o f f ileの略です。 std :: cinは標準入力です。標準入力は、通常の状況では、決して終わりに達しません。いつでも、さらに入力することができます。
さらに、.eof()は、ファイルの終わりを超えて読み取ろうとしたために入力操作がすでに失敗した場合にのみtrueを返します。プログラムは実際にはわかりません「ファイルの終わり」にあることを;つまり、データを読み取る次の試行が失敗することがわかる唯一の方法は、実際に試行することです。