2016-10-09 8 views
4

に各行を格納する、カンマでの入力、分割の複数の行を取る一緒に働くことになる入力の種類の例である:(標準入力から来る) ここで文字列配列

Archery,M,TEAM,Archery,Lord's Cricket Ground,1. GOLD,team ITA,Italy 
Archery,M,TEAM,Archery,Lord's Cricket Ground,2. SILVER,team USA,United States 
Archery,M,TEAM,Archery,Lord's Cricket Ground,3. BRONZE,team KOR,South Korea 
Cycling,M,IND,Road,Regent's Park,1. GOLD,Aleksander Winokurow,Kazakhstan 
Cycling,M,IND,Road,Regent's Park,2. SILVER,Rigoberto Uran,Colombia 
Cycling,M,IND,Road,Regent's Park,3. BRONZE,Alexander Kristoff,Norway 
Fencing,F,IND,Foil,ExCeL,1. GOLD,Elisa Di Francisca,Italy 
InsertionEnd 

タイトルが示唆するように、私はそれぞれの行をカンマで区切り、それらの文字列のそれぞれを配列(または文字列のベクトル)に格納したいと考えています。次に、配列の各項目を取得し、関数のパラメータとして使用したいと思います。私は複数の行を読み込む方法と文字列を分割する方法を知っていますが、これらのものを一緒に置くと実際に私のために働いていません。思考の

私のライン:

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 

using namespace std; 
int main() 
{ 
    string line; 
    stringstream ss(line); 

while (line != "InsertionEnd") { 

    vector<string> array; 
    getline(ss, line, ','); 
    array.push_back(line); 
    addItem(array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]) 
    } 
} 

私は私の配列を取得した後、だから、僕はアスリートの構造体を作成し、私が作ったのaddItem機能を(8つのパラメータを取ります)を使用します。そうですね:

myTable.addItem("Archery","M","TEAM","Archery","Lord's Cricket Ground","1. GOLD","team ITA","Italy"); 

私は正しい道にありますか?またはこれは完全にベースオフですか?ありがとう。

注:私はaddItem関数をテストしており、パラメータを自分で入力するだけで動作します。ここで

答えて

3

あなたの考え方は正しい軌道に乗っています。コード内でいくつかの間違いを犯しています:
- stringstream ss(line); - 空の文字列にstringstreamを初期化しています。最初に行を入力してからそれを文字列ストリームに挿入する必要があります。
- array.push_back(line); - 文字列lineを直接結果ベクトルにプッシュします。最初にそれを構成語に分解する必要があります。

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    string line; 
    vector<vector<string>> array; 
    while (true) 
    { 
     getline (cin, line); 
     if (line == "InsertionEnd") 
     { 
      break; 
     } 

     stringstream ss (line); 
     string word; 
     vector<string> vector_line; 
     while (getline (ss, word, ',')) 
     { 
      vector_line.push_back (word); 
     } 
     array.push_back (vector_line); 
    } 
} 
2

は、各ラインを分割し、抽出されたトークンとaddItemを呼び出して、適切に入力をループソリューションです:

string line; 
while (getline(cin, line)) { // for each line... 
    if (line == "InsertionEnd") break; 

    // split line into a vector 
    vector<string> array; 
    stringstream ss(line); 
    string token; 
    while (getline(ss, token, ',')) { // for each token... 
     array.push_back(token); 
    } 

    // use the vector 
    addItem(array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]); 
} 
+0

まあ一つ一つのラインのための新しいベクトルがあるはずの:


は、次のコードは、あなたの問題への実用的なソリューションを実装しますか?だから、whileループの外側にあるベクトルを宣言すれば、ループが実行されて渡されるたびに新しいベクトルを作成するのではなく、ただ一つの巨大なベクトルを作成するのではないでしょうか? – djdangerousdick

+1

あなたの 'line'変数の内容がどこから来たのかはっきりしていません...私の回答を更新します – qxz

+1

私は私の答えを変更しました。 – qxz