0

内部に次のようなテキストを.txt含むファイルがあります(これは単なる断片です):

...
[332, 605]-[332, 592], srednica: 13
[324, 593]-[332, 605], srednica: 14.4222
[323, 594]-[332, 605], srednica: 14.2127
[323, 594]-[331, 606], srednica: 14.4222
[324, 593]-[324, 607], srednica: 14
[323, 594]-[323, 607], srednica: 13
[319, 596]-[319, 607], srednica: 11
[320, 595]-[320, 607], srednica: 12
... 

私がする必要があるのは、各行から最初の 4 つの数値を取得し、それらを整数に格納することです。

私はこのように試してみました:

ifstream file("punkty_srednice.txt");
string line;
int ax, ay, bx, by;
while(getline(file, line)) {
    stringstream s(line);
    string tmp;
    s >> tmp >> ax >> tmp >> ay >> tmp >>  bx >> tmp >> by >> tmp;
    cout << ax  << " " << ay <<  " " << bx << " " << by << endl;
}

出力 (ほんの一部):

...
506 506 -858993460 -858993460
503 503 -858993460 -858993460
495 503 -858993460 -858993460
497 503 -858993460 -858993460
500 497 -858993460 -858993460
492 503 -858993460 -858993460
...

ご覧のとおり、次のような奇妙な数字がいくつかあります-858993460

私はこのように削除tmpして直進することで他の試みをしました:

s >> ax >> ay >>  bx >> by;

しかし、出力には次のようなゴミ番号のみが含まれます-858993460

どうすれば対処できますか?

4

1 に答える 1

1

as 区切り記号を使用std::getlineして、数字で最初の部分を取得できます。','次に、数字以外のすべての文字をスペースに置き換えます (例 を参照std::transform)。次に、結果の文字列を に入れ、std::istringstreamそこから 4 つの数値を読み取ります。


コードの何が問題なのかについてのいくつかのヒントです。ほとんどの場合、文字列で使用すると、入力演算子はスペースで区切られ>>た文字列を読み取ります。

だからラインのために

[332, 605]-[332, 592]、スレドニカ: 13

あなたの入力は

  1. tmpその中に入れます"[332,"
  2. その中に入れaxます605
  3. tmpその中に入れます"]-[332,"
  4. ayその中に入れます592
  5. tmpその中に入れます"],"
  6. 有効な数値ではない文字列を読み取ろうとし、入力が失敗して入力ストリームにフラグを設定しbx、後続すべての入力を無効にします"srednica"fail

を使用して、文字列内の数字以外の文字をスペースに置き換える方法std::transform:

std::string s = "[332, 605]-[332, 592]";
std::cout << "Before: \"" << s << "\"\n";

std::transform(std::begin(s), std::end(s), std::begin(s),
    [](const char& ch) -> char
    {
        return (std::isdigit(ch) ? ch : ' ');
    });

std::cout << "After : \"" << s << "\"\n";

上記のコードが出力されます

変更前: 「[332, 605]-[332, 592]」
後:「332 605 332 592」
于 2014-07-25T11:06:35.570 に答える