2011-03-15 55 views
3

http://pstreams.sourceforge.net/ pstreams是一个非常简单的库,为C++重新实现popen()。如何获得pstreams的完整流输出?

该库安装非常简单,只包含一个单独的头文件。你可以在这里下载的头文件,并把它添加到您的应用程序:
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标签这个问题,上述其他两个。

回答

7

流操作符>>被设计为一次读取std :: string字符,同时跳过周围的空白,就像读取数字时一样。

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

std::getline(in, str); 
+0

+1,谢谢。我现在回到pstreams和std文档,找出它的记录位置,以及为什么我应该知道它;)在我的答案中查看完整的代码解决方案。再次感谢。 – augustin 2011-03-15 08:34:52

+0

而不是一次获取整个流内容(就像在我的答案中的代码中一样)是否有办法一次获得所有内容?如果不是,为什么不呢? – augustin 2011-03-15 08:46:03

+2

这取决于数据的外观。默认情况下,getline会读取直到找到行结束符'\ n'。如果你想让它在别的地方停下来,你可以添加一个额外的参数,比如'getline(in,str,'\ 0');',它会读取直到找到'\ 0'或者直到流到达文件结束状态。 – 2011-03-15 09:34:22

0

解决方案的基础上,博·佩尔松的提示:

#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; 
} 

[编辑:]而一个更简单的解决方案,再基于博的评论:

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; 
} 
3

的问题是没有什么真的,我的pstreams库是关于istream的,你会从ifstream或其他istream读取完全相同的行为。但读取所有子进程输出的最简单方法是:

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

+1,谢谢。再次,我是一个新手。我做了功课,在找了几天之后才问,但很显然,我在错误的地方搜索了。一旦你知道如何,这真的很简单;)欢迎使用Stackoverflow。 – augustin 2011-03-15 11:00:41