2017-04-13 22 views
0

私はC++コードにいくつかの問題があります。私は次のコードを持っていますが、これまでのところ、ほとんどのデータを構造化データ型に格納することはできません。構造体の整数、文字および浮動小数点

//structured data declaration 
    struct item 
    { 
     int itemCode; 
     char description[20]; 
     float price; 
    }; 

そして、getコードは次のようになります。

cout << setprecision(2) << fixed << showpoint; 

ofstream salesFile ("Sales.txt"); 
ifstream stockFile ("Stock.txt"); 
for (counter = 0; counter < 9; counter++) 
{ 
    stockFile >> instock[counter].itemCode; 
    stockFile.getline (instock[counter].description, 20); 
    stockFile >> instock[counter].price; 
} 

出力は次のように見ている必要があります。

1234 "ここでの説明" 999.99 数量X

そして、これが出力された:

1234 0.00 数量5

+2

[MCVE]を入力してください。 – clcto

+1

または少なくとも "stockFile"の形式。 –

+1

説明が項目コードの後の行にある場合は、 'getline()'を呼び出す前に改行を過ぎて読み取る必要があります。さもなければ、それはちょうど項目コードの後の行の残りを読みます。 – Barmar

答えて

1

あなたは(1つのエントリの)形式であるファイル形式を持っている場合(複数行にわたる)

1234 
description here 
999.99 

その後、説明が簡単な

であるあなたのループ内のコードを読んでThが、その

stockFile >> instock[counter].itemCode; 
stockFile.getline (instock[counter].description, 20); 
stockFile >> instock[counter].price; 

はこの順番で動作しますん

  1. instock[counter].itemCodeの値は1234の値を受け取ります。しかし、(これは理解することが重要です)1234の後の改行は、ストリームの中でまだ読むことを待っています
  2. getline()の呼び出しで改行が発生し、すぐに戻ります。 instock[counter].descriptionには、文字列""が含まれます。
  3. stockFile >> instock[counter].priceには、説明の中でdが発生します。これは整数値として解釈できないため、instock[counter].priceは変更されません。

上記のコードでは、instock[counter].price999.99と設定すると、上記の一連のイベントで出力が説明されます。

実際の問題は、入力のスタイルを1つのストリームに混在させることです。この場合、ストリーミングオペレータ>>をライン指向入力(getline())を使用して混在させます。上記のシーケンスの私の記述によれば、異なるスタイルの入力は、(この場合のように)改行に遭遇したときに異なる動作をするため、異なる方法でやりとりします。

instock[counter].itemCodeを読んだ後、改行をスキップするように指示する人がいます。そのアドバイスには、変更にうまく対応していないために欠陥があります(たとえば、ファイル形式が別の行に別のフィールドを含むように変更された場合、ファイルが期待通りのフォーマットではない場合理由?)。

より一般的な解決策は、入力のスタイルを1つのストリームに混合しないようにすることです。一般的な方法は、getline()を使用してストリームからすべてのデータを読み取ることです(つまり、stockFileと直接やりとりするには>>を使用しないでください)。次に、各文字列を解釈/解析し、必要な情報を見つけます。

ちなみに、charの配列を使用して文字列を保持するのではなく、標準std::string(標準ヘッダー<string>から)を試してみてください。これには、std::stringが必要に応じて長さを調整できるという利点があります。 std::getline()にも、喜んでstd::stringに読める過負荷があります。データがストリームからstd::stringとして読み込まれると、必要に応じて解釈されます。

文字列を解釈するには(文字列から整数値を抽出するなど)、さまざまな方法があります。私はエクササイズとしてそのアプローチを見つけることを残すでしょう - あなたはそれを自分でやることでもっと学びます。

+0

私は助けに感謝しますが、残念ながら、この割り当てのプロンプトは明示的に文字列オブジェクトの使用を禁止します。しかし、getline()演算子を使用するのも私の初期の考えでしたが、整数と浮動小数点変数に使用できるかどうかは不明でした。 –

+0

そして 'getline()'を使って行を 'char'の配列に読み込み、それを解析します。あなたの配列よりも長いファイルの行の可能性をチェックし、対処しなければならないかもしれません。 – Peter

関連する問題