gpt4 book ai didi

c++ - 将终端对 bash 命令的响应读入 C++ 变量

转载 作者:行者123 更新时间:2023-11-28 03:45:49 26 4
gpt4 key购买 nike

有谁知道将 bash 命令的终端输出读入 C++ 的方法吗?例如,在终端中输入“ls”会返回当前目录中的文件名,有没有什么办法可以将这些名称导入到字符串或字符数组之类的东西中?我一直在查看 fork()exec()pipe()。我试图打开子项(此处输入的系统命令)和父项(此处读取的输出)之间的管道通信,但完全没有成功。想法?

最佳答案

感谢 Kerrek SB,我看到人们以各种方式使用 popen(),但不确定这是否是追求的途径。在文档的帮助下,并将其他人如何使用它的部分内容放在一起,我想到了这个。这就是我写的问题具体询问的内容:将来自命令“ls”的终端响应导入到文件名 vector 中。但是,每个文件名都包含一个换行符,我隐式删除了该换行符,将字符串文件中除最后一个元素之外的所有元素都推回到 vector 中。

void currentDirFiles( vector<string> & filesAddress )
{
FILE * pipe = popen( "ls", "r" );
char buffer[1000];
string file;
vector<string> files;
while ( fgets( buffer, sizeof( buffer ), pipe ) != NULL )
{
file = buffer;
files.push_back( file.substr( 0, file.size() - 1 ) );
}
pclose( pipe );
filesAddress.swap( files );
}

我正在尝试根据 Mankarse 的建议调整维基百科 RAII 示例以满足我的需求,这就是我目前所做的。看起来我走在正确的轨道上吗?我对此有什么明显的错误或误解吗?

 #include <cstdio>

// exceptions
class file_error { } ;
class open_error : public file_error { } ;
class close_error : public file_error { } ;
class read_error : public file_error { } ;

class TerminalPipe
{
public:
TerminalPipe():
pipeHandle(std::popen("ls", "r"))
{
if( pipeHandle == NULL )
throw open_error() ;
}
~TerminalPipe()
{
std::pclose(pipeHandle) ;
}
void currentDirFiles( vector<string> & filesAddress )
{
char buffer[1000];
string file;
vector<string> files;
while ( fgets( buffer, sizeof( buffer ), pipeHandle ) != NULL )
{
if( std::ferror( pipeHandle ) )
throw read_error();
else
{
file = buffer;
files.push_back( file.substr( 0, file.size() - 1 ) );
}
}
}
private:
std::FILE* pipeHandle ;
// copy and assignment not implemented; prevent their use by
// declaring private.
TerminalPipe( const file & ) ;
TerminalPipe & operator=( const file & ) ;
};

然后这样调用它:

vector<string> dirFiles;
TerminalPipe pipe;
pipe.currentDirFiles( dirFiles );

关于c++ - 将终端对 bash 命令的响应读入 C++ 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7753006/

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