2013-03-19 99 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")); 
}