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

aug*_*tin 3 c++ system stream 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我受到了阻碍.

相关问题:
c ++中的popen等价
如何使用POSIX执行命令并在C++中获取命令输出?

主持人请注意:此问题和上述其他两个问题需要pstreams标记.

Bo *_*son 7

流式传输器>>设计为一次读取一个单词到std :: string,同时跳过周围的空格,就像读取数字时一样.

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

std::getline(in, str);
Run Code Online (Sandbox Code Playgroud)

  • 这取决于数据的样子.默认情况下,getline会一直读取,直到找到行尾"\n".如果你想让它停在其他地方,你可以添加一个额外的参数,比如`getline(in,str,'\ 0');`,它会读取,直到它找到'\ 0'或直到流到达它文件结束状态. (2认同)