如何使用pstream获得全流输出?

时间:2011-03-15 08:13:55

标签: c++ stream system popen

http://pstreams.sourceforge.net/ pstreams显然是一个非常简单的库,为C ++重新实现了popen()。

该库安装非常简单,只包含一个头文件。您可以在此处下载头文件并将其添加到您的应用程序中:
http://pstreams.cvs.sourceforge.net/viewvc/pstreams/pstreams/pstream.h?view=log

我认为我想要的非常简单:向系统发送命令并获取其输出。 pstreams的主页(上图)和文档提供了以下示例:

redi::ipstream in("ls ./*.h");
std::string str;
while (in >> str) {
    std::cout << str << std::endl;
}

它似乎运行良好,但代码实际上从输出中删除所有空格和回车。试试这个:

redi::ipstream in("ls -l"); /* The command has a slightly more complicated output. */
std::string str;
while (in >> str) {
    std::cout << str
}
std::cout << std::endl;

我们得到一个没有任何空格的looong连接字符串。

我尽力理解文档,而我最接近解决方案的是:

 redi::ipstream in("ls -l");
 std::string str;
 while (!in.rdbuf()->exited()) {
 in >> str;
 }
 std::cout << str << std::endl;

但是,输出在第一个空格处完全被截断。

我受到了阻碍。

相关问题:
popen equivalent in c++
How to execute a command and get output of command within C++ using POSIX?

版主注意:此问题需要pstreams标记,上面的其他两个标记。

3 个答案:

答案 0 :(得分:7)

流媒体运营商&gt;&gt;设计用于一次读取一个单词到std :: string,同时跳过周围的空格,就像读取数字时一样。

如果您想一次阅读整行文本,请改用getline。

std::getline(in, str);

答案 1 :(得分:3)

这个问题与我的pstreams库无关,它是关于istream的,你会从ifstream或其他istream中获得完全相同的行为。但是阅读所有子进程输出的最简单方法是:

redi::ipstream in("ls -l");
std::stringstream ss;
ss << in.rdbuf();
std::string s = ss.str();

答案 2 :(得分:0)

解决方案,基于Bo Persson的提示:

#include <pstream.h>
#include <iostream>
#include <stdio.h>

int main() {
        redi::ipstream in("ls -l");
        std::string str;
        std::string s;
        while (std::getline(in, s)) {
                str += s + '\n';
        }
        std::cout << str;
        return 0;
}

[编辑:]这是一个更简单的解决方案,再次基于Bo的评论:

include <pstream.h>
#include <iostream>
#include <stdio.h>

int main() {
        redi::ipstream in("ls -l");
        std::string str;
        std::getline(in, str, '\0');
        std::cout << str;
        return 0;
}
相关问题