【问题标题】:how to pass data from terminal to a program?如何将数据从终端传递到程序?
【发布时间】:2013-09-05 08:49:04
【问题描述】:

我正在使用 GPS 接收器,它将使用这样的 C++ 程序在终端中连续打印 GPS 消息

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);           

但我需要从终端获取这些值。

这两个程序都是用 c++ 编写的,但它们属于不同的框架。

【问题讨论】:

  • 需要更清楚地了解您想要做什么。您是否尝试从其他 c++ 程序中获取值?或者您是否尝试将“打印/输出”值读取到终端窗口? (这就是问题听起来的样子)。听起来其他 c++ 程序写入(比如说)标准输出,而您想要捕获该数据?都是用 Qt 编写的吗?
  • @code_fodder 谢谢。我想将终端中的其他程序打印输出带到 c++ 程序(QT 应用程序)
  • 好的很酷...为您发布了一个选项,但我认为 sorin 是“最快”的路线,如果您想快速做到这一点,而不用担心花时间让它变得美好和未来证明:) ...一切都取决于你的最终目标是什么

标签: c++ qt map gps qgis


【解决方案1】:

我假设您的库没有您可以使用的 API。 然后一种相当直接的集成它们的方法是使用管道。 您可以快速执行类似

的操作
gps_program | qt_program

现在您可以通过标准输入获取坐标。

更复杂的设置方法是使用 exec 和 fork。您创建管道对象,然后在其中一个分支上使用 exec gps_program 进行分叉和运行。这可以完全在您的代码中完成,而无需依赖 bash 或类似的东西。您仍然必须以相同的方式解析来自管道的数据。

【讨论】:

  • 谢谢索林。我会尽力告诉你结果。
【解决方案2】:

只需创建一个管道:

#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

注意:示例会无限运行。

【讨论】:

    【解决方案3】:

    +1 对 Sorin 的回答,这使得将 stdout 传递给 stdin 变得又好又容易 :) 但假设你在 linux / cigwin 中运行?

    但是,如果您可以访问这两个程序代码,那么更好的解决方案是使用 UdpSockets(或者可能是 Tcp,但 Udp 更简单)并以这种方式在程序之间传递数据......不确定多大/长期您的解决方案必须是,但如果您想以“长期”和更可维护的方式集成它们,这将是一种更好的方法。

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多