我正在创建一个HTML文件,用于创建一个名为Quake的对象的Google地图,其中包含纬度,经度,幅度和深度。另一个名为QuakeData的类是一个创建Quake对象向量的类。
下面的函数获取对象的向量,并获取它们的详细信息(纬度,经度和幅度),然后以这种格式将它们输出到HTML中:
[58.678, -151.887, 'M2.6'],
第一个数字是纬度,第二个是经度,第三个是幅度,显示格式。
这是我目前拥有的循环,它使用getter提取纬度,经度和幅度:
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)
这到底出了什么问题?任何帮助将不胜感激。
答案 0 :(得分:5)
每个循环将新数据附加到现有流:在循环内移动声明,以便为每一行使用新实例。
for (i = quakes.begin(); i != quakes.end(); i++)
{
ostringstream out;
答案 1 :(得分:3)
您需要在迭代之间清除您的ostringstream。使用out.str(""); out.clear();
(查看here以获取解释)。
答案 2 :(得分:1)
complete = out.str();
out.str("");
答案 3 :(得分:0)
正如人们所指出的那样,您需要重置ostringstream
或缩小其范围。
编写代码的一种更为惯用且有效的方法是提取用于输出Quake
到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"));
}