我试图将我的航点保存到.json文件中,但它总是保存错误的字符串..我不知道它来的地方。
这是我的代码:
for (int i = 1; i < path->GetPointCount(); i++) {
Vector lonlatalt;
path->GetPointLocation(i).GetGeodetic(&lonlatalt);
sstr << "waypoint";
sstr << i;
sstr << " ";
sstr << lonlatalt.x;
sstr << " ";
sstr << lonlatalt.y;
sstr << " 0.0";
sstr << std::endl;
std::string alt = " 0.0";
QJsonObject json;
json["waypoint"+i] = lonlatalt.x, lonlatalt.y, alt;
QJsonDocument json_doc(json);
QString json_string = json_doc.toJson();
QString filename = "./tempwpf";
QFile save_file(filename);
if(!save_file.open(QIODevice::WriteOnly)){
qDebug() << "failed to open save file";
}
save_file.write(json_string.toLocal8Bit());
save_file.close();
}
json文件的输出应为:
{
"waypoint0": "10.05456, 51.02453, 0.0",
"waypoint1": "10.05456, 51.02453, 0.0",
"waypoint2": "10.05456, 51.02453, 0.0",
"waypoint3": "10.05456, 51.02453, 0.0",
"waypoint4": "10.05456, 51.02453, 0.0",
"waypoint5": "10.05456, 51.02453, 0.0",
"waypoint6": "10.05456, 51.02453, 0.0"
}
答案 0 :(得分:4)
json["waypoint"+i] = lonlatalt.x, lonlatalt.y, alt;
这一行中没有一件正确的事情。
"waypoint"+i
"waypoint"
是一个字符串文字,即char
的数组,它衰减到指向其第一个元素的指针;现在,如果你将一个整数加到一个指针上,你会得到一个递增的指针,即指向第一个之后i
个元素的指针。
因此,在这里,你实际上是从"waypoint"
个字符开始的i
子字符串。 "waypoint"+1
=&gt; "aypoint"
; "waypoint"+2
=&gt; "ypoint"
等等。
鉴于您无论如何使用Qt和QString
将其放入JSON文档中,您只需使用Qt字符串格式化方法;所以,在左侧你可以这样做:
json[QString("waypoint%1").arg(i)]
在右边,它又错了;在这里你错误地使用了逗号运算符,它在两侧计算表达式并丢弃左边的表达式;所以当你写作
lonlatalt.x, lonlatalt.y, alt
你正在写作
(lonlatalt.x, lonlatalt.y), alt
归结为普通alt
。
现在,如果要将其格式化为以逗号分隔的字符串,则可以再次使用QString
方法:
json[QString("waypoint%1").arg(i)] = QString("%1, %2, 0.0").arg(lonlatalt.x, 0, 'f', 5).arg(lonlatalt.y, 0, 'f', 5)
最后,您在每次迭代时创建/保存一个新的QJsonDocument,因此每次创建只有一个航点的文件并覆盖前一个航点时。你应该在循环之外移动创建/保存:
QJsonObject json;
在for
json["waypoint"+i] = lonlatalt.x, lonlatalt.y, alt;
留在里面,其余的都在外面。请注意,即使要保存的代码也不是最理想的:json_doc.toJson()
已经返回UTF-8中的QByteArray
(通常用作&#34;规范&#34; JSON编码);您正在将其重新转换为QString
,然后将其转换回8位编码(这是有损的,很可能是无意的)。
此外,您检查文件是否已成功打开,即使出现错误也要写入文件 - 这绝对是一个坏主意。
最后,不需要close()
- 当QFile
超出范围时,它会自动执行。
总结一下:
QFile save_file("./tempwpf");
if(save_file.open(QIODevice::WriteOnly)){
QJsonDocument json_doc(json);
save_file.write(json_string.toJson());
} else {
qDebug() << "failed to open save file";
}