1

我正在创建一个 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)

这里到底有什么问题?任何帮助将不胜感激。

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或缩小其范围。

编写代码的一种更惯用和更有效的方法是提取代码以将 a 输出Quake到 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 回答