2016-04-08 7 views
0

タスクは次のようになります: 名前、価格、金額を1行に入力してください。 1.私の問題は、次のとおりです。 あなたが望むとおりに例のタイプのための場合は、できるだけ多くの行を入力する必要があります 猿200 3 アカエイ399 1C++複数のcinデフォルト値が入力されていない場合、マップに追加<文字列、ベクトル<double>>

それは動作しますが、あなたが唯一の名前と価格に言及した場合に量があるべき1が指定されていない場合は、1にマップに追加されます。代わりにutは次のものにジャンプし、ループ上でintに文字列名を入力します。これを行うための他の方法はありますか?

#include <string> 
#include <map> 
#include <vector> 
int main(){ 
    map<string, vector<double>> vec; 
    string name; 
    double price; 
    double amount; 
    while(cin >> name >> price >> amount){ 
     vec[name] = {price , amount} 
    } 

return 0; 
} 
+0

あなたのやり方では、ユーザーは3つのフィールドを入力する必要があり、量はオプションのようです。あなたは、それが単一の文字列であるかのようにそれを読み取って分割する必要があります - あなたが金額を見つけた場合、あなたはデフォルトのパスに行きます。そうでない場合は、別のパスに移動します。 –

+0

okej、私はgetl​​ineコマンドのようなものを読んだことがありますが、私の状況で@LeonardoAlvesMachadoを正しく使用するには – Jim

+0

行を 'string'に読み込みます。 'string'を' stringstream'にロードし、次にデータを解析します。あなたがファイルを紛失している場合、ストリームはエラー状態になり、その量をデフォルトにするかどうかを知ることになります。 – NathanOliver

答えて

0

私自身の問題を解決しました。これは私のソリューションであり、私の質問で述べたパラメータで動作します。

Firstclass myclass; 
string item, data; 
vector<string> split_input; 

// reads in on line of string until ctrl-z/ctrl-d 
while(getline(cin, data)){ 
    stringstream str_stream(data); 
    // reading the values separate adding them to vector 
    while(str_stream >> item{ 
     split_input.push_back(item); 
    } 
    // if amount is not given 
    if(v.size() == 2){ 
     myclass.insert_data(split_input[0], stod(split_input[1]), 1.00); 
    } 
    // if if amount is given 
    else{ 
     myclass.insert_data(split_input[0], stod(split_input[1]), stod(split_input[2])); 
    } 
    // clearing the vector 
    split_input.clear(); 
} 
0

これを試してみてください:

#include <string> 
#include <map> 
#include <vector> 
#include <cctype> 

int main(){ 
    map<string, vector<double>> vec; 
    string name; 
    double price; 
    double amount; 
    int peek_; 

    do{ 
     amount = 1; 
     std::cin >> name >> price; 
     std::cin >> std::ws; //get rid of white space 
     int peek_ = cin.peek(); 
     if (std::isdigit(peek_)){ 
     std::cin >> amount; 
     } 
     vec[name] = {price , amount} 
    } while (peek_ != EOF) 

return 0; 
} 

これはあなたの一般的なアイデアを与える必要があります。詳細については、hereもチェックしてください。

注:私は外出先でこれを書いたので、コンパイルもテストもしていません。あなたは構文で少し再生する必要があります:)

私は助けてくれることを望みます。

+0

ありがとうたくさん!私はこれを試してみよう! – Jim

+0

isdigit(c)がisdigit(peek_)に変更されたのでwhileループasweelの外側でdelek peek_を必要としましたが、私はdeldcare(peek_)に変更されましたが、私はあなたが終了することができるはずですctrl-Dのループ。そして、私はマップの内容を印刷する機能を持っています – Jim

+0

私の悪い、私はループ内の 'peek_'を宣言すると思っていたかわからない笑 –

関連する問題