使用cin :: fail()从stdin读取无限循环

时间:2013-12-18 12:42:23

标签: c++ function vector push-back

我正在努力使用矢量push_back函数。 我们的目标是拥有一个能够推动n个元素的函数,直到您决定停止为止。 所以我对'停止'的想法是cin.fail()。

故障功能

void pushbackVector(vector<double> &data)
{
    double input;
    cin >> input;

    for (int i = 0; i < 100; i++)
    {
        if (cin.fail())
        {
            cout << "Ending input.\n";
            return;
        }
        else
        {
            data.push_back(input);
        }
    }

问题是当我尝试使用它时,我进入一个无限循环。

我还没有按照ASC顺序对第一个向量进行排序,其次是DESC顺序,并将第一个和第二个连接到第三个向量。但是我相信我可以自己管理这个。 无论如何整个代码......

#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>

using namespace std;

// function prototypes
void menu();
void printVector(const vector<double> &data);
void pushbackVector(vector<double> &data);
void sortVector (vector<double> &data);

int main()
{
    menu();

    vector<double> row1;
    vector<double> row2;

    /* not yet used
    vector<double> row3;
    */

    int input;
    cin >> input;

    bool exit = 0;

    while (!exit)
    {
        switch (input)
        {
            case 1:
                pushbackVector(row1);
                break;

            case 2:
                pushbackVector(row2);
                break;

            case 3:
                printVector(row1);
                break;

            case 4:
                printVector(row2);
                break;

            case 5:
                cout << "Printing out the contents of row 1\n";
                printVector(row1);
                cout << "Printing out the contents of row 2\n";
                printVector(row2);
                cout << "Printing out the contents of row 3\n";
                // printVector(row3);
                break;

            case 6:
                cout << "Exitting\n";
                exit = 1;
                break;

            default:
                cout << "Invalid choice\n";
        }
    }


    return 0;
}

void menu()
{
    cout << "Choose an option\n";
    cout << "1) Enter first vector\n";
    cout << "2) Enter second vector\n";
    cout << "3) Print out the first vector\n";
    cout << "4) Print out the second vector\n";
    cout << "5) Print out all three vectoros\n";
    cout << "6) Exitting the program\n";
}

void printVector(const vector<double> &data)
{
    for(int i = 0; i < data.size(); i++)
    {
        cout << data[i] << ", ";
    }
    cout << "\n";
}

void pushbackVector(vector<double> &data)
{
    double input;
    cin >> input;

    for (int i = 0; i < 100; i++)
    {
        if (cin.fail())
        {
            cout << "Ending input.\n";
            return;
        }
        else
        {
            data.push_back(input);
        }
    }

}

void sortVector (vector<double> &data)
{
    cout << "Sorting your vector \n";
    sort(data.begin(), data.end());
}

6 个答案:

答案 0 :(得分:2)

你只读一次,在循环内移动读数:

void pushbackVector(vector<double> &data)
{
    double input;
    // cin >> input;   --------------
                                    //
    for (int i = 0; i < 100; i++)   //
    {                               //
        cin >> input;   // <---------

        if (cin.fail())
        {
            cout << "Ending input.\n";
            return;
        }
        else
        {
            data.push_back(input);
        }
    }

这将确保您真正得到输入。现在,如果您不打算输入100个值,则需要以某种方式通知流。这是通过在其中插入“EOF字符”来完成的。在Windows上按CTRL + Z或在unix终端上按CTRL + D.

当从流中读取它时,它会进入fail(和eof)状态,除非您在适当时调用cin.clear()清除错误标志,否则它将保持不变

你也犯了同样的错误。您只能在while循环之前阅读一次,因此input会保留您初始输入的值并继续输入相同的选项。我认为那是你所谈论的无限循环。要修复它,请在switch之前移动read语句。

希望有所帮助。


另外,这就是我编写函数的方法:

double input;
for (int i = 0; (cin >> input) && i < 100; ++i) {
     data.push_back(input);
}
cout << "Ending input.\n";

Streams可以在布尔表达式中使用 - 它们转换为!fail()的结果 - 这是控制循环的一种方便且惯用的方法。

答案 1 :(得分:1)

无限循环是因为您正在阅读:

cin >> input;

一次,然后输入一个while循环(在main中)将永远继续(除非输入最初等于6)。

变化:

cin >> input;

bool exit = 0;

while (!exit)
{
    // ...

为:

bool exit = 0;

while (!exit)
{
    cin >> input;
    // ...

根据您的逻辑,pushbackVector函数位于:

也会发生同样的情况
double input;
cin >> input;

for (int i = 0; i < 100; i++)
{
    // ...

您可能希望将其更改为:

double input;

for (int i = 0; i < 100; i++)
{
    cin >> input;
    // ...

答案 2 :(得分:1)

做这样的事情:

void pushbackVector(vector<double> &data)
{
    double input;

    while (cin >> input) //will return true when there's valid input, otherwise false
    {
        if (input == -1)
        {
            cout << "Ending input.\n";
            return;
        }
        else
        {
            data.push_back(input);
        }
    }

这将读取输入,直到您输入-1或输入无效输入。

我认为依靠cin.fail()并不是一个好主意。链接中解释了use fail()的正确方法。这不是你所期望的。

答案 3 :(得分:0)

如果你输入了一些你不应该输入的东西,那么放错了阅读,你需要清除输入。

如果

,首先添加te块
cin.clear(); 
cin.ignore( numeric_limits<streamsize>::max(), '\n' );

答案 4 :(得分:0)

我会按照以下方式编写函数

void pushbackVector( std::vector<double> &data )
{
    cin.clear(); 
    cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );

    data.insert( data.end(), std::istream_iterator<double>( std::cin ), std::istream_iterator<double>() ); 
}

答案 5 :(得分:0)

我几天前就完成了,但我忘记发布我的回答了。 谁知道我可以说cin是否失败,停止输入但不结束程序,哈哈。

    #include<iostream>
    #include<vector>
    #include<algorithm> // for sort algorithms
    #include<iomanip>  // for setprecision

    using namespace std;

    // function prototypes
    void menu();
    void printVector(const vector<double> &data);
    void pushbackVector(vector<double> &data);
    void sortVector (vector<double> &data);

    int main()
    {
        vector<double> row1;
        vector<double> row2;
        vector<double> row3;

        int input;
        bool exit = false;

        while(!exit)
        {
            menu();
            cin >> input;

            switch (input)
            {
                case 1:
                    cout << "Entering vector 1\n";
                    pushbackVector(row1);
                    sortVector(row1);

                    cout << "\n";
                    break;

                case 2:
                    cout << "Entering vector 2\n";
                    pushbackVector(row2);
                    sortVector(row2);
                    reverse(row2.begin(), row2.end());

                    cout << "\n";
                    break;

                case 3:
                    cout << "Printing out vector 1\n";
                    printVector(row1);

                    cout << "\n";
                    break;

                case 4:
                    cout << "Printing out vector 2\n";
                    printVector(row2);

                    cout << "\n";
                    break;

                case 5:
                    // reserve enough space for all of row1's and row2's elements
                    row3.reserve(row1.size() + row2.size());
                    // insert row1's elements at the end of row3
                    row3.insert(row3.end(), row1.begin(), row1.end());
                    // insert row2's elements at the end of row3
                    row3.insert(row3.end(), row2.begin(), row2.end());


                    cout << "Printing out the contents of vector 1\n";
                    printVector(row1);
                    cout << "Printing out the contents of vector 2\n";
                    printVector(row2);
                    cout << "Printing out the contents of vector 3\n";
                    printVector(row3);


                    cout << "\n";
                    break;

                case 6:
                    cout << "Exitting\n";
                    exit = true;
                    break;

                default:
                    cout << "Invalid choice\n";
            }
        }


        return 0;
    }

    void menu()
    {
        cout << "Choose an option\n";
        cout << "1) Enter first vector\n";
        cout << "2) Enter second vector\n";
        cout << "3) Print out the first vector\n";
        cout << "4) Print out the second vector\n";
        cout << "5) Print out all three vectoros\n";
        cout << "6) Exitting the program\n";
    }


    void printVector(const vector<double> &data)
    {
        for(int i = 0; i < data.size(); i++)
        {
            cout << setprecision(4) << data[i] << " ";
        }
        cout << "\n";
    }

    void pushbackVector(vector<double> &data)
    {
        double input;
        int numOfItems;
        cout << "How many items you want to add into vector?: ";
        cin >> numOfItems;

        for (int i = 0; i < numOfItems; i++)
        {
            cin >> input;
            if (cin.fail())
            {
                cout << "Ending input.\n";
                return;
            }
            else
            {
                data.push_back(input);
            }
        }
    }

    void sortVector(vector<double> &data)
    {
        cout << "Sorting your vector \n";
        sort(data.begin(), data.end());
    }