假设我在下面有这段代码,我用它来运行一个简单的命令,比如 ls
并假设输出为 100
线长。
当我们在做cout << buff
在下面的代码中,输出是逐字节流式传输、逐位流式传输还是逐行流式传输,或者间隔是多少?
假设我们要打印 new_line!
我们流式传输时每一行的字符串结尾 cout<<buff
.我们该怎么做?
我在想while
循环我们应该有一些东西来检查它是否刚刚流式传输(或即将流式传输)\n
进入我们的字符串流 output
,并且它决定在它流入输出之后(或之前)做一些事情。
最初我只是把它做成数据结构来存储所以我只需要知道如何检查\n
因为我们正在缓冲以及在哪里放置添加 new_line!
的函数或者我想做的任何事情。
代码如下:
#include <iostream>
#include <stdio.h>
using namespace std;
// imaginary
// stringstream output;
int main() {
FILE *in;
char buff[512];
if(!(in = popen("ls -sail", "r"))){
return 1;
}
while(fgets(buff, sizeof(buff), in)!=NULL){
// output << buff;
// if there is a new line
// output << "new_line!";
cout << buff;
}
pclose(in);
return 0;
}
最佳答案
如果你使用 GNU libc 那么你可以使用 getline()
而不是 fgets
。参见 here以获得更详细的解释。
否则,请使用系统提供的任何工具从 FILE*
中读取一行。如果你真的找不到这样的设施(这将是非常令人惊讶的),那么最坏的情况下你总是可以使用 this approach . fgets
也是一个很好的解决方案,前提是您考虑了缓冲区大小限制并在需要时自行进行更多缓冲(检查 the doc,所有内容均已解释)。
你要记住的是 popen
只返回一个 FILE*
所以任何适用于标准文件的东西也适用于你的情况。网络上有很多例子。
现在对于您问题的“间隔”部分,恐怕没有什么意义。首先,这取决于外部命令将新数据打印到标准输出的时间间隔。无论如何,只要外部命令写入它,您就可以在程序中读取它。
关于c++ - 运行命令时 popen 的间隔是多少以及如何逐行捕获输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15167888/