C ++只用一个命令逐行读取终端的文件流

问题描述 投票:0回答:1

简短:我想将终端中的数据读入变量并将其与字符串进行比较。

Long:我正在使用GOEMBED的TI AM3358开发板,它运行嵌入式Linux。我用这个套件从canbus读取数据。要将数据从canbus读入终端,我使用socketcan。

当我将以下命令运行到终端时,我从总线获得了一条can消息的数据流。

candump can0

我写了一些代码来执行上面的命令并返回输出。

string GetCmdOutput(const char * cmd)
{
    char buffer[128];
    string result = "";
    string different;
    FILE* pipe = popen(cmd,"r");
    int counter=0;
    if(!pipe) throw runtime_error("popen() failed!");
    try {
        if(fgets(buffer,128,pipe) !=NULL){
            while(counter<1){
                result +=buffer;
                counter++;
            }
        }
    }catch(...){
        pclose(pipe);
        throw;
    }

    pclose(pipe);
    return result;
}

在int main()中,我运行以下代码,将终端输出与字符串进行比较:

string dump = "candump can0";
const char *senddump;
senddump = dump.c_str();

string newOutput;
int senddata = 0;
int i = 0;
int x = 0;
int amountS = 0;
int y = 0;
string datas;
while(i<1)
{
    newOutput = GetCmdOutput(senddump);
    cout<<newOutput + "\n";

        if(newOutput=="  can0  000   [2]  01 12\n")
        {
            canWrite(busn,baudrate, sendID, dlcn,data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]);

        }


    }

代码本身有效,但我错过了canbus的大量数据。我认为这样做的原因是我总是需要重新初始化canbus(cmd - > candump can0)。

现在我的问题是:如何更改我的代码,我只需要运行命令“candump can0”,并且代码总是将下一个messafes与字符串进行比较。如果这是可能的,我想我会获得很多性能。

如果您有其他命令或其他选项来改善表现,请毫不犹豫地提出建设性的批评。 (我不是专业人士!我试着学习)

/ EDIT 1 /以下数据流是如何输出到终端的

can0  712   [1]  05
can0  192   [6]  1C 0F 19 00 00 00
can0  70B   [1]  00
can0  70B   [1]  85
can0  703   [1]  00
can0  707   [1]  00
can0  709   [1]  00

在此先感谢,亲切的问候,TMO

c++ terminal embedded-linux can-bus socketcan
1个回答
0
投票

如果有来自candump的连续输出,你可以简单地将输出传递给你的程序,如下所示:

$ candump can0 | myprogram

myprogram.cpp看起来有点像这样:

#include <iostream>
#include <string>

int main()
{
    std::string message;

    while(std::getline(std::cin, message))
    {
        // process message here ... eg. ...
        if(message == "can0  000   [2]  01 12")
        {
            // do something specific ...        
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.