C ++ Построчное чтение файлового потока из терминала с помощью только одной команды

Вкратце: я хочу прочитать данные из терминала в переменную и сравнить их со строкой.

Лонг: Я использую плату разработки TI AM3358 от GOEMBED, на которой работает встроенный 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 (cmd -> candump can0).

Теперь мой вопрос: как изменить мой код, чтобы мне нужно было только запустить команду «candump can0», и чтобы код всегда сравнивал следующие сообщения со строкой. Если это возможно, я думаю, что уже добьюсь большого успеха.

Если у вас есть другие команды или другие возможности для повышения производительности, не стесняйтесь давать конструктивную критику. (Я не профессионал! Стараюсь учиться)

/ 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


person TMO    schedule 13.04.2018    source источник
comment
Как разные сообщения разделяются в потоке? Каждый из них переходит на новую строку?   -  person Galik    schedule 13.04.2018
comment
Я отредактировал свой вопрос. Это непрерывный выход. каждый на новой строке.   -  person TMO    schedule 13.04.2018


Ответы (1)


Если из 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 ...        
        }
    }
}
person Galik    schedule 13.04.2018
comment
Привет, Галик, спасибо за ответ. Это хороший ответ. Но тогда у меня возникла следующая проблема (которую я не объяснил. Моя вина!). Чтобы сузить поток сообщений до моей встроенной системы, я иногда меняю параметры candump. Например. Первые шаги использую candump can0. Но после того, как я собрал данные запуска, я меняю свой Candump на Candump can0,712: 1FFFFFFF. Таким образом, я могу частично отфильтровать поток данных перед чтением во встроенную систему. Так есть ли другой способ сделать это? - person TMO; 16.04.2018
comment
@TMO Вы можете просто передать новую команду программе таким же образом: candump can0,712:1FFFFFFF | myprogram - person Galik; 16.04.2018
comment
Привет, я не думаю, что полностью понимаю. Прости. Итак, в первую очередь я пишу myprogram.cpp. Затем, когда я нахожусь в терминале, я запускаю candump can0 | моя программа. В определенный момент я получаю следующее сообщение can0 000 [2] 01 12. Теперь, когда я получаю это сообщение, я хочу изменить свою команду на candump can0,712: 1FFFFFFF. Затем, если я правильно понял, мне нужно остановить свою программу и снова ввести следующую команду в терминале: candump can0,712: 1FFFFFFF | моя программа. Наверное, я вас совершенно не понимаю. Я хочу, чтобы это происходило автоматически. Надеюсь, вы понимаете, что я пытаюсь объяснить. - person TMO; 16.04.2018