据我对noskipws
的了解,它禁止跳过空格。因此,如果要使用noskipws
,则需要在程序中使用一些char来分隔空格。我尝试通过按Ctrl + D(对于Windows为Ctrl + Z)将cin
设置为eof
条件。但是,如果我使用char
或string
输入,则使用单个输入将流设置为文件末尾。但是,如果使用其他数据类型,则需要按两次该组合键。如果我删除了noskipws
请求,其他所有工作都很好。下面的代码更精确地解释了该问题:
#include <iostream>
using namespace std;
int main()
{
cin >> noskipws; //noskipws request
int number; //If this int is replaced with char then it works fine
while (!cin.bad()) {
cout << "Enter ctrl + D (ctrl + Z for windows) to set cin stream to end of file " << endl;
cin >> number;
if (cin.eof()) {
break; // Reached end of file
}
}
cout << "End of file encountered" << endl;
return 0;
}
为什么
cin
具有这种方式?尽管无法将输入内容放入int
变量中,但它至少应在收到请求后立即将标志设置为eof
。为什么即使用户按下Ctrl + Z也需要第二次输入? 最佳答案
使用noskipws
时,您的代码负责提取空白。当您读取int时,它会失败,因为遇到空白。
参见an example:
#include <iostream>
#include <iomanip>
#include <cctype>
#define NOSKIPWS
#define InputStreamFlag(x) cout << setw(14) << "cin." #x "() = " << boolalpha << cin.x() << '\n'
using namespace std;
int main()
{
#ifdef NOSKIPWS
cin >> noskipws;
char ch;
#endif
int x;
while (cin >> x) {
cout << x << ' ';
#ifdef NOSKIPWS
while (isspace(cin.peek()))
{
cin >> ch;
}
#endif
}
cout << endl;
InputStreamFlag(eof);
InputStreamFlag(fail);
InputStreamFlag(bad);
InputStreamFlag(good) << endl;
return 0;
}
或visual studio。
关于C++:noskipws延迟某些数据类型的文件检测结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37784797/