0

次のようにフォーマットされた標準入力から情報を受け取るとします。

1 2 3 #3 John Tee #2
4 2 1 @1 Tree Bee #9

<int><int><int><char followed by int><string><string><char followed by int>

プログラムで使用するためにこの情報を抽出する最速の方法は何ですか? また、次のように、4 番目と 7 番目の引数に '#' とそれに続く数字のみが含まれていることを確認したい (そうでない場合は終了する) か、次のように行が早く終了していないことを確認したいとします。

1 4 2 #4 John

これを最もクリーンで効率的な方法で C++ で行うにはどうすればよいでしょうか?

4

1 に答える 1

2

繰り返される行ベースの解析に対する私のお気に入りのアプローチstd::getlineは、ループの条件として使用してからwhile、内部の行を解析することです。

std::string line;
while (std::getline(input_stream, line)) {
  std::istringstream line_stream(line);
  // Parse the line by extracting from line_stream
}

解析を開始する前に、行全体があることを確認します。このようにして、1 行の解析で何か問題が発生した場合でも、次の行に移動して続行します。

#たとえば、次のように始まるフィールドのチェックを実行します。

int value;
if (line_stream.get() == '#' &&
    line_stream >> value &&
    std::isspace(line_stream.peek())) {
  // Success
}

私のアプローチは、抽出物を常に何らかの状態に置くことです。これは、フォーマットの問題をできるだけ早く発見することを意味します。

于 2013-03-29T22:44:46.660 に答える