C ++只用一个命令逐行读取终端的文件流
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++只用一个命令逐行读取终端的文件流相关的知识,希望对你有一定的参考价值。
简短:我想将终端中的数据读入变量并将其与字符串进行比较。
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
答案
如果有来自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 ...
}
}
}
以上是关于C ++只用一个命令逐行读取终端的文件流的主要内容,如果未能解决你的问题,请参考以下文章