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

标签 c++ stream popen

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

相关文章:

c# - 将 TextReader 流式传输到文件

C++:getline 不是参数列表的一部分

java - 任何了解 Streams、Buffer 及其在 Java 中的用法的教程?

c - fgets() 如何跟踪它在哪一行?

Python + ffmpeg 类型错误 : not all arguments converted during string formatting

c - popen2 : reading works, 写入不

python - 在没有控制台的情况下使用 Popen 在 python 中运行进程

c++ - 使用 const 引用初始化成员数据

c++ - 有没有办法恢复/恢复 nohup 以在控制台中查看输出?

c++ - 二进制比较的结果减少到什么数据类型?