あなたは(1つのエントリの)形式であるファイル形式を持っている場合(複数行にわたる)
1234
description here
999.99
その後、説明が簡単な
であるあなたのループ内のコードを読んでThが、その
stockFile >> instock[counter].itemCode;
stockFile.getline (instock[counter].description, 20);
stockFile >> instock[counter].price;
はこの順番で動作しますん
instock[counter].itemCode
の値は1234
の値を受け取ります。しかし、(これは理解することが重要です)1234
の後の改行は、ストリームの中でまだ読むことを待っています。
getline()
の呼び出しで改行が発生し、すぐに戻ります。 instock[counter].description
には、文字列""
が含まれます。
- 式
stockFile >> instock[counter].price
には、説明の中でd
が発生します。これは整数値として解釈できないため、instock[counter].price
は変更されません。
上記のコードでは、instock[counter].price
〜999.99
と設定すると、上記の一連のイベントで出力が説明されます。
実際の問題は、入力のスタイルを1つのストリームに混在させることです。この場合、ストリーミングオペレータ>>
をライン指向入力(getline()
)を使用して混在させます。上記のシーケンスの私の記述によれば、異なるスタイルの入力は、(この場合のように)改行に遭遇したときに異なる動作をするため、異なる方法でやりとりします。
instock[counter].itemCode
を読んだ後、改行をスキップするように指示する人がいます。そのアドバイスには、変更にうまく対応していないために欠陥があります(たとえば、ファイル形式が別の行に別のフィールドを含むように変更された場合、ファイルが期待通りのフォーマットではない場合理由?)。
より一般的な解決策は、入力のスタイルを1つのストリームに混合しないようにすることです。一般的な方法は、getline()
を使用してストリームからすべてのデータを読み取ることです(つまり、stockFile
と直接やりとりするには>>
を使用しないでください)。次に、各文字列を解釈/解析し、必要な情報を見つけます。
ちなみに、char
の配列を使用して文字列を保持するのではなく、標準std::string
(標準ヘッダー<string>
から)を試してみてください。これには、std::string
が必要に応じて長さを調整できるという利点があります。 std::getline()
にも、喜んでstd::string
に読める過負荷があります。データがストリームからstd::string
として読み込まれると、必要に応じて解釈されます。
文字列を解釈するには(文字列から整数値を抽出するなど)、さまざまな方法があります。私はエクササイズとしてそのアプローチを見つけることを残すでしょう - あなたはそれを自分でやることでもっと学びます。
[MCVE]を入力してください。 – clcto
または少なくとも "stockFile"の形式。 –
説明が項目コードの後の行にある場合は、 'getline()'を呼び出す前に改行を過ぎて読み取る必要があります。さもなければ、それはちょうど項目コードの後の行の残りを読みます。 – Barmar