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标签这个问题,上述其他两个。
+1,谢谢。我现在回到pstreams和std文档,找出它的记录位置,以及为什么我应该知道它;)在我的答案中查看完整的代码解决方案。再次感谢。 – augustin 2011-03-15 08:34:52
而不是一次获取整个流内容(就像在我的答案中的代码中一样)是否有办法一次获得所有内容?如果不是,为什么不呢? – augustin 2011-03-15 08:46:03
这取决于数据的外观。默认情况下,getline会读取直到找到行结束符'\ n'。如果你想让它在别的地方停下来,你可以添加一个额外的参数,比如'getline(in,str,'\ 0');',它会读取直到找到'\ 0'或者直到流到达文件结束状态。 – 2011-03-15 09:34:22