Он пропускает вторую функцию getline ()? - PullRequest
1 голос
/ 05 марта 2012

Я пытался выяснить, почему он не читает мою вторую функцию 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 Ответ

4 голосов
/ 05 марта 2012

Проблема здесь:

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

Это читает символ подтверждения из ввода. Но не символ '\ n'. Таким образом, следующий readline будет читать только этот символ новой строки.

Лучше не смешивать std :: getline () и operator >> при чтении с ввода.

Я бы изменил код так:

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

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