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标记,上面的其他两个标记。
答案 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;
}