0

次のような情報の行と列を含むファイルがあります。

104857 Big Screen TV  567.95
573823 Blender         45.25

この情報を 3 つの個別の項目に解析する必要があります。左側の識別番号を含む文字列、項目名を含む文字列、および価格を含む double 変数です。情報は常に同じ列、つまり同じ順序で見つかります。

これを達成するのに苦労しています。ファイルから読み取らず、サンプル文字列を使用するだけの場合でも、私の試みはごちゃごちゃした混乱を出力するだけです:

string input   = "104857 Big Screen TV  567.95";
string tempone = "";
string temptwo = input.substr(0,1);
tempone += temptwo;
for(int i=1 ; temptwo != " " && i < input.length() ; i++)
{
  temptwo = input.substr(j,j);
  tempone += temp2;
}
cout << tempone;

私はかなり長い間上記のコードを微調整しようとしましたが、運が悪く、現時点ではそれを行う他の方法は考えられません.

4

4 に答える 4

4

std::find_first_ofと を使用して、最初のスペースと最後のスペースを見つけることができますstd::find_last_of。これを使用して、文字列をより適切に 3 つに分割できます。最初のスペースは最初の変数の後にあり、最後のスペースは 3 番目の変数の前にあり、その間のすべてが 2 番目の変数です。

于 2012-12-10T06:51:34.113 に答える
0

ファイルコンポーネントを分解してみてください。

  • 数字が常に最初に来ることを知っています。また、数字に空白がないこともわかっています。
  • 数字に続く文字列には空白を含めることができますが、数字は含まれません(私が想定します)
  • このタイトルの後に、より多くの数字が表示されます(空白なし)

これらのコンポーネントから、次のことを推測できます。

最初の番号を取得するのは、ファイルストリームを使用して読み取るのと同じくらい簡単です<<。文字列を取得するには、数値に達するまで確認し、一度に1文字ずつ取得して、それを文字列に挿入する必要があります。最後の番号は最初の番号と同じで、ファイルストリームを使用します<<

これは宿題のようですので、残りをまとめましょう。

于 2012-12-10T06:54:21.073 に答える
0

次の行に沿った正規表現を試してみます。

^([0-9]+)\s+(.+)\s+([0-9]+\.[0-9]+)$

私は正規表現構文があまり得意ではありませんが([0-9]+)、数字のシーケンス (これは ID) に対応し([0-9]+\.[0-9]+)、浮動小数点数 (価格) であり(.+)、「スペース」文字のシーケンスによって 2 つの数値から分離された文字列です。\s+. 次のステップは、「.50」や「10」などの価格で機能するためにこれが必要かどうかを確認することです。

于 2012-12-10T07:00:13.630 に答える
0

次の疑似コードはどうですか:

string input = "104857 Big Screen TV  567.95";
string[] parsed_output = input.split(" "); // split input string with 'space' as delimiter

// parsed_output[0] =  104857
// parsed_output[1] =  Big
// parsed_output[2] =  Screen
// parsed_output[3] =  TV
// parsed_output[4] =  567.95

int id = stringToInt(parsed_output[0]);
string product = concat(parsed_output[1], parsed_output[2], ...  ,parsed_output[length-2]);
double price = stringToDouble(parsed_output[length-1]);

私はそれが明らかであることを願っています。

于 2012-12-10T06:52:51.950 に答える