gpt4 book ai didi

c++ - 运行命令时 popen 的间隔是多少以及如何逐行捕获输出?

转载 作者:行者123 更新时间:2023-11-30 02:56:49 25 4
gpt4 key购买 nike

假设我在下面有这段代码,我用它来运行一个简单的命令,比如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com