я использую приемник GPS, который будет печатать сообщение GPS в терминале с помощью программы на C ++, подобной этой
Latitude:13.3 Longitude:80.25
Latitude:13.4 Longitude:80.27
Latitude:13.5 Longitude:80.28
Я хочу взять эти данные в моей программе на C ++ (приложение QT)
Ниже приведен мой полный программный код
void QgsGpsPlotPluginGui::on_buttonBox_accepted()
{
QString myPluginsDir = "usr/lib/qgis/plugins";
QgsProviderRegistry::instance(myPluginsDir);QgsVectorLayer * mypLayer = new QgsVectorLayer("/home/mit/Documents/Dwl/GIS DataBase/india_placename.shp","GPS","ogr");
QgsSingleSymbolRenderer *mypRenderer = new
QgsSingleSymbolRenderer(mypLayer->geometryType());
QList <QgsMapCanvasLayer> myLayerSet;
mypLayer->setRenderer(mypRenderer);
if (mypLayer->isValid())
{
qDebug("Layer is valid");
}
else
{
qDebug("Layer is NOT valid");
}
// Add the Vector Layer to the Layer Registry
QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE);
// Add the Layer to the Layer Set
myLayerSet.append(QgsMapCanvasLayer(mypLayer, TRUE));
QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0);
mypMapCanvas->setExtent(mypLayer->extent());
mypMapCanvas->enableAntiAliasing(true);
mypMapCanvas->setCanvasColor(QColor(255, 255, 255));
mypMapCanvas->freeze(false);QgsFeature * mFeature = new QgsFeature();
QgsGeometry * geom = QgsGeometry::fromPoint(*p);
QGis::GeometryType geometryType=QGis::Point;
QgsRubberBand * mrub = new QgsRubberBand (mypMapCanvas,geometryType);
QgsPoint * p = new QgsPoint();
double latitude =13.3;
double longitude = 80.25;
p->setX(latitude);
p->setY(longitude);
mrub->setToGeometry(geom,mypLayer);
mrub->show()
}
В приведенном выше коде я вручную ввел значение для широты и долготы, как это,
double latitude =13.3;
double longitude = 80.25;
p->setX(latitude);
p->setY(longitude);
но мне нужно получить эти значения из терминала.
Обе программы написаны на с ++, но они принадлежат разным фреймворкам.
Я предполагаю, что в вашей библиотеке нет API, который вы можете использовать.
Тогда одним довольно простым способом их интеграции было бы использование каналов.
Вы можете быстро сделать что-то вроде
gps_program | qt_program
И теперь вы получаете координаты через стандартный ввод.
Более сложный способ настроить это — использовать exec и fork. Вы создаете объекты канала, затем выполняете разветвление и запускаете, используя exec gps_program на одной из веток. Это вы можете делать полностью в своем коде, не завися от bash или чего-то подобного. Вам все равно придется анализировать данные, поступающие из канала, таким же образом.
Просто создайте трубу:
#include <cstdio>
#include <iostream>
#define WWRITER 0
#if WWRITER
int main() {
while (true) {
std::cout << "Latitude:13.3 Longitude:80.25";
}
return 0;
}
#else
int main() {
FILE* fp = popen("Debug/Writer", "r");
if(fp == 0) perror(0);
else {
const std::size_t LatitudeLength = 9;
const std::size_t LongitudeLength = 10;
char latitude_name[LatitudeLength+1];
char longitude_name[LongitudeLength+1];
double latitude;
double longitude;
while(fscanf(fp, "%9s%lf%10s%lf",
latitude_name,
&latitude,
longitude_name,
&longitude) == 4)
{
std::cout << "Values: " << latitude << ", " << longitude << std::endl;
}
pclose(fp);
}
return 0;
}
#endif
Примечание: пример работает бесконечно.
+1 к ответу Сорина, делает этот простой и удобный способ передачи стандартного вывода на стандартный ввод 🙂 но при условии, что вы работаете в linux / cigwin?
Но если у вас есть доступ к обоим программным кодам, то лучшим решением будет использование UdpSockets (или, может быть, Tcp, но Udp проще) и передача данных между программами таким образом … не уверен, насколько большим / долгосрочным нужно ваше решение быть, но если вы хотите интегрировать их в «долгосрочной» и более поддерживаемой форме, это будет лучшим подходом.