gpt4 book ai didi

c++ - 在 C++ 中读取 popen 结果

转载 作者:可可西里 更新时间:2023-11-01 15:16:12 24 4
gpt4 key购买 nike

我正在编写 C++ 应用程序,我需要读取系统命令的结果。

我正在或多或少地使用 popen(),如下所示:

    const int MAX_BUFFER = 2048;
string cmd="ls -l";
char buffer[MAX_BUFFER];
FILE *stream = popen(cmd.c_str(), "r");
if (stream){
while (!feof(stream))
{
if (fgets(buffer, MAX_BUFFER, stream) != NULL)
{
//here is all my code
}
}
pclose(stream);
}

我一直在尝试以不同的方式重写它。我看到了一些非标准的解决方案,例如:

FILE *myfile;
std::fstream fileStream(myfile);
std::string mystring;
while(std::getline(myfile,mystring))
{
// .... Here I do what I need
}

虽然我的编译器不接受这个。

如何在 C++ 中读取 popen

最佳答案

你的例子:

FILE *myfile;
std::fstream fileStream(myfile);
std::string mystring;
while(std::getline(myfile,mystring))

不起作用,因为虽然您非常接近,但标准库不提供可以从 FILE* 构建的 fstreamBoost iostreams但是确实提供了一个可以从文件描述符构造的 iostream,您可以通过调用 filenoFILE* 中获取一个。

例如:

typedef boost::iostreams::stream<boost::iostreams::file_descriptor_sink>
boost_stream;

FILE *myfile;
// make sure to popen and it succeeds
boost_stream stream(fileno(myfile));
stream.set_auto_close(false); // https://svn.boost.org/trac/boost/ticket/3517
std::string mystring;
while(std::getline(stream,mystring))

别忘了稍后pclose

注意:较新版本的 boost 已弃用仅采用 fd 的构造函数。相反,您需要将 boost::iostreams::never_close_handleboost::iostreams::close_handle 之一作为强制性第二个参数传递给构造函数。

关于c++ - 在 C++ 中读取 popen 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7807755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com