它会跳过第二个getline()函数?

时间:2012-03-04 22:47:52

标签: c++ getline

我一直试图弄清楚为什么它没有读取我的第二个getline()函数。第一个getline(cin,input)适用于获取分区的输入数据。我为获取工作数据做了同样的事情,但它不起作用。没有错误或任何东西。它只是跳过那条线。任何帮助将不胜感激。谢谢。

#include <iostream>
#include <string>
#include "memory.h"

#define show(a) std::cout << #a << ": " << (a) << std::endl

using std::cin;
using std::cout;
using std::endl;

int main(void)
{
    //Variables
    int MEM_SIZE = 0;

    vector<int> partition_input;
    vector<int> job_input;


    while(true)
    {
        //INPUT PARTITION DATA
        while(true)
        {
            char confirm;           
            string input;
            int temp;               //Temporary variable to store extracted data 
            int num_part = 0;       //Iterator to check partition size and memory, and partition limits
            int check_size = 0;

            cout << "Please enter the memory size and partitions in the following format: \n";
            cout << "1000 250 250 250 250 \n";
            cout << "> ";

            getline(cin, input);        //The whole of user input is stored in variable "line"
            istringstream os(input); //"line" is passed to stringstream to be ready to be distributed

            while(os >> temp)
            {
                partition_input.push_back(temp);
                check_size += partition_input[num_part];
                num_part++;
            }


            //sets the first input to MEM_SIZE
            //AND deletes it from the partition vector
            MEM_SIZE = partition_input[0];
            partition_input.erase(partition_input.begin(), partition_input.begin()+1);

            check_size -= MEM_SIZE;

            cout << "Memory size: " << MEM_SIZE << endl;
            cout << "# of Partitions: " << partition_input.size() << endl;
            cout << "Partition Sizes: ";

            for(int i = 0; i < partition_input.size(); i++)
                cout << partition_input[i] << ' ';
            cout << endl;

            cout << "Correct? (y/n) ";
            cin >> confirm;

            cout << endl << endl;
            if(confirm == 'n')
                continue;

            //Checks the total partition size and the total memory size
            if(!(MEM_SIZE >= check_size)) 
            {
                cout << "ERROR: Total partition size is less than total memory size." << endl;
                system("pause");
                continue;
            }
            //Check if it exceeded the max number of partition limit
            if((num_part-1) >=5)
            {
                cout << "ERROR: You have entered more than the allowed partition(5). Please try again. \n";
                system("pause");
                continue;
            }

            break;
        }

        //START INPUT JOB DATA

        do
        {
            string input2;
            cout << "Please enter the size of each job in the following format." << endl;
            cout << "300 100 200 400" << endl;
            cout << "> ";

            //*******************
            //IT SKIPS THESE TWO LINES
            getline(cin, input2);
            istringstream oss(input2);  
            //*******************

            int j;
            while(oss >> j)
                job_input.push_back(j);

            for(int i = 0; i < job_input.size(); i++)
                cout << job_input[i] <<  ' ';
            break;
        }while(false);
        //END OF INPUT JOB DATA


        break;
    }

    Memory A1(MEM_SIZE, partition_input.size(), partition_input, job_input.size(), job_input);

    //A1.FirstFit();
    //    A1.BestFit();
    //    A1.NextFit();
    //    A1.WorstFit();

    //system("pause");
    return 1;
}

1 个答案:

答案 0 :(得分:4)

问题在于:

        cout << "Correct? (y/n) ";
        cin >> confirm;

这将从输入中读取确认字符。 不是'\ n'字符。因此,下一个readline将只读取换行符。

最好不要混合使用std :: getline()和operator&gt;&gt;从输入中读取时。

我会将代码更改为:

        cout << "Correct? (y/n) ";
        std::string confirmLine;
        std::getline(cin, confirmLine);

        cout << endl << endl;
        if(confirmLine == "n")
            continue;