2013-03-19 101 views
1

我正在創建一個HTML文件,它創建一個名爲Quake的Google地圖,其中包含緯度,經度,大小和深度。另一個叫做QuakeData的類是創建一個Quake對象向量的類。for循環迭代器產生錯誤的結果C++

下方的函數採用對象的矢量,並得到它們(緯度,經度和幅度)的詳細信息,然後把它們輸出到HTML格式如下:

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

其中第一個數字是緯度,第二個是經度,第三個是Magnitude,如圖所示。

這裏是我目前擁有的循環,提取緯度,經度和使用幅度干將:

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) 

這裏究竟是什麼錯誤?任何幫助將不勝感激。

回答

5

每個循環都會將新數據附加到現有流中:將循環中的聲明移動到循環中,以便爲每一行使用新的實例。

for (i = quakes.begin(); i != quakes.end(); i++) 
{ 
    ostringstream out; 
+0

謝謝你,很有道理。 – 2013-03-19 20:04:17

3

您需要在迭代之間清除ostringstream。使用out.str(""); out.clear();(檢查here作爲解釋)。

+0

謝謝,我現在明白了。 – 2013-03-19 20:04:35

1
complete = out.str(); 
out.str(""); 
+0

再次,謝謝你 – 2013-03-19 20:12:24

0

正如人們已經指出,您需要重置ostringstream或縮小其範圍。

更慣用的和有效的方式來編寫代碼是提取代碼outputing一個Quakeostream,然後使用標準算法來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")); 
}