据我对noskipws的了解,它禁止跳过空格。因此,如果要使用noskipws,则需要在程序中使用一些char来分隔空格。我尝试通过按Ctrl + D(对于Windows为Ctrl + Z)将cin设置为eof条件。但是,如果我使用charstring输入,则使用单个输入将流设置为文件末尾。但是,如果使用其他数据类型,则需要按两次该组合键。如果我删除了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/

10-10 05:24