1

緯度、経度、大きさ、深さを含む Quake というオブジェクトの Google マップを作成する HTML ファイルを作成しています。QuakeData と呼ばれる別のクラスは、Quake オブジェクトのベクトルを作成するクラスです。

以下の関数は、オブジェクトのベクトルを取得し、それらの詳細 (緯度、経度、大きさ) を取得して、次の形式で HTML に出力します。

[58.678, -151.887, 'M2.6'],

最初の数値は緯度、2 番目は経度、3 番目はマグニチュードで、表示されている形式で表されます。

これは私が現在持っているループで、ゲッターを使用して緯度、経度、マグニチュードを抽出します。

double mag;
double lat;
double lon;
string complete;
ostringstream out;
vector<Quake>::const_iterator i;
for (i = quakes.begin(); i != quakes.end(); i++)
{
    mag = i->getMagnitude();
    lat = i->getLatitude();
    lon = i->getLongitude();

    out << "[" << lat << ", " << lon << ", 'M" << mag << "'],";
    complete = out.str();
    outfile << complete << endl;
}

ただし、これにより次のような結果が生成されます。

[58.678, -151.887, 'M2.6'], (end of line)
[58.678, -151.887, 'M2.6'],[33.92, -117.08, 'M2.9'],(end of line)
[58.678, -151.887, 'M2.6'],[33.92, -117.08, 'M2.9'],[-3.203, 142.864, 'M4.7'],(end of line)

私が欲しいのは:

[58.678, -151.887, 'M2.6'],(end of line)
[33.92, -117.08, 'M2.9'],(end of line)
[-3.203, 142.864, 'M4.7'],(end of line)

ここで正確に何が間違っていますか?どんな助けでも大歓迎です。

4

4 に答える 4

5

各ループは新しいデータを既存のストリームに追加します。宣言をループ内に移動して、各行に新しいインスタンスを使用するようにします。

for (i = quakes.begin(); i != quakes.end(); i++)
{
  ostringstream out;
于 2013-03-19T20:03:13.377 に答える
3

反復の間に ostringstream をクリアする必要があります。を使用しますout.str(""); out.clear();(説明については、こちらを参照してください)。

于 2013-03-19T20:03:14.147 に答える
1
complete = out.str();
out.str("");
于 2013-03-19T20:07:18.177 に答える
0

人々が指摘したように、をリセットするostringstreamか、そのスコープを縮小する必要があります。

Quakeコードを記述するためのより慣用的で効率的な方法は、 aを anに出力するためのコードを抽出し、ostream標準アルゴリズムを使用しcopyて、中間の を必要とせずに出力ストリームに直接出力することostringstreamです。

ostream& operator<<(ostream& os, const Quake& quake) {
    os << "["
       << quake.getLatitude() << ", "
       << quake.getLongitude() << ", "
       << "'M" << quake.getMagnitude()
       << "']";
    return os;
}

int main() {
    vector<Quake> quakes;
    ofstream outfile("quakes.txt");

    copy(quakes.begin(), quakes.end()
        ostream_iterator<Quake>(outfile, ",\n"));
}
于 2013-03-19T20:22:43.010 に答える