2016-04-24 14 views
1

リストから読み込んで物をパラレルベクトルで保存するインベントリシステムを作ろうとしています。私のベクタは、自分のコードに含まれているクラスのパブリックメンバとして設定されています。テキストファイルには、ここでは、このファイルの次の行から読むC++

1111 
Dish Washer 
20 250.50 550.50 
2222 
Micro Wave 
75 150.00 400.00 
3333 
Cooking Range 
50 450.00 850.00 
4444 
Circular Saw 
150 45.00 125.00 
6236 
Tacos 
200 5.00 5.50 

のように見える私はどこに私のコードブレークのコメント私のコード

int main() 
{ 
    char choice; 
    Inventory Stocksheet(5); // the included list has 5 items if a text file has more then it should scale fine 
    int id, ordered; 
    string name; 
    double manuprice, price; 
    ifstream data; 
    data.open("Inventory Data.txt"); 
    if (data.fail()) 
    { 
     cout << "Data sheet failed to open \n"; 
     exit(1); 
    } 
    while (data >> id) 
    { 
     Stocksheet.itemID.push_back(id); 
     getline(data,name); 
     Stocksheet.itemName.push_back(name); // this is where my code fails 
     data >> ordered; 
     Stocksheet.pOrdered.push_back(ordered); 
     Stocksheet.pInstore.push_back(ordered); 
     data >> manuprice; 
     Stocksheet.manuPrice.push_back(manuprice); 
     data >> price; 
     Stocksheet.sellingPrice.push_back(price); 
    } 

    do 
    { 
     cout << "  Your friendly neighborhood tool shack\n"; 
     cout << "Select from the following options to proceed \n"; 
     cout << "1. Check for item \n"; 
     cout << "2. Sell an iem \n"; 
     cout << "3. Print Report \n"; 
     cout << "Input any number other than 1,2 or 3 to exit \n"; 
     cout << "Selection : "; 
     cin >> choice; // think about sstream here 
     switch (choice) 
     { 
     case '1': checkforitem(Stocksheet); 
      break; 
     case '2': sellanitem(Stocksheet); 
      break; 
     case '3': printthereport(Stocksheet); 
      break; 
     default: cout << " ^-^ Exiting the shop. Have a fantastic day! ^-^ \n"; 
      break; 
     } 

    }while ((choice == '1') || (choice == '2') || (choice == '3')); 
    data.close(); 
    return 0; 
} 

です。 whileループでは、数値IDが最初のベクトルにプッシュされますが、名前は空白で、その後のすべての値は空白のままです。私のループの設定に何か問題がありますか?

+0

あなたが尋ねていることから少し離れているので、答えとして投稿するつもりはありません。データを処理する方がはるかに簡単な行のベクトルのようなものに分割することを検討したいかもしれません。任意の行が微風になります)、特に将来このような操作を行う必要がある場合 –

+0

@WilliamKappler私はそれをどうやってやるのか分かりません。私はちょうどベクトルが何であるか学びました。これまで私がベクトルについて新しいことを学んだのは、私の研究室インストラクターが「いいえ、あなたは配列を使う必要はありません」ということです。 – Callat

+1

ベクトルは基本的には配列ですが、後でサイズを決定する機能などの機能を備えています。格納する必要がある行の数( '\ n'文字の数+ 1)、' std :: vector 'のサイズをそのサイズに変更した後、各 '\ n'に読み込みます入力の終わりに達するまで、ベクトルの各連続する要素に書き込みます。基本的に、PHPの 'explode()'のC++バージョンが必要です。私はこれがあなたの質問とは別のものかもしれないと言いました。 –

答えて

3

>>演算子を使用すると、「単語」型のものが得られます。それは空白で止まります。したがって、getlineと呼ぶと、最初の行の最後に改行が読み込まれ(その上にIDがある)、停止します。したがって、nameは空白です。

getlineに切り替える前にdata.ignore()に電話をかけると、改行が処理されます。 >>演算子をgetlineと混同してください。あなたが期待していることはしません。

+0

OMFGはこれが魅力的に機能しました!私は 'data.ignore()'を使いませんでした。これで私のループは5つの項目を反復して適切な場所にプッシュし、このプログラムのデバッグを続けることができます。大変ありがとうございました!ああ、私は 'getline()'で作業しなければなりませんでした。名前の一部が空白で区切られているので、全体を取得する必要があります。 – Callat

+1

@Hikari申し訳ありません、ええ、 'data.ignore()' 。私はあなたがファイルで作業していたことを忘れていました。私は答えを編集して、あとで明らかにします。私は 'getline'を使用してあなたを責めません、それは必要ですが、それは迷惑なだけのクールです。あまり邪魔にならず、より一貫性を持たせるために、混合する代わりに 'scanf'を試すことができます。 – kchinger

+0

一般的なケースでコンピュータができる唯一の賢明なことをしているのは、本当に「奇抜」ではありません。必要なのは、_all_行を 'getline'で読み込み、必要に応じて個別に解析/変換することです。 –

関連する問題