如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?
Posted
技术标签:
【中文标题】如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?【英文标题】:How to read/redirect output of a dos command to a program variable in C/C++? 【发布时间】:2010-11-27 02:42:52 【问题描述】:我想从我的程序中运行一个 dos 命令,例如“dir”命令。 我正在这样做,
system("dir");
有没有办法将该命令的输出直接读取到程序变量中?
我们总是可以将输出重定向到一个文件,然后读取该文件,方法是system("dir > command.out");
然后读取 command.out 文件。但是我们怎样才能直接做而不是重定向到文件然后读取呢?
【问题讨论】:
我希望您真的在运行其他命令,而不是“dir”,因为有更好的方法可以从 C 或 C++ 中获取目录列表。 是的,dir 只是为了举例。实际上我正在运行另一个命令行应用程序,然后尝试读取它的输出。我无法控制/访问该应用程序的代码,否则我会重用该代码本身。 【参考方案1】:你不能将它重定向到一个变量,但你可以做一个类似于 Unix 中使用管道链接命令的技巧。调用CreateProcess()
,并将STARTUPINFO
实例传递给它,并相应地设置句柄和STARTUPINFO::dwFlags
中的STARTF_USESTDHANDLES
。然后通过设置的句柄读取来自衍生进程的数据。
【讨论】:
【参考方案2】:如果你的库有popen()
POSIX 函数,那就是你需要的。您可以从管道读取命令输出并以任何您喜欢的方式对其进行解析。
FILE *dir;
char direntry[80];
dir = popen("dir", "r");
while (!feof(dir))
fgets(direntry, sizeof(direntry), dir);
/* do something with direntry */
【讨论】:
这仅适用于 unix 系统,对吗?我的意思是 popen() 不是标准 c/c++ 的一部分。我怀疑等效的库是否可以在 windows 上使用 popen()。 是POSIX函数。有适用于 Windows 的 POSIX 堆栈 - en.wikipedia.org/wiki/Posix#POSIX_for_Windows【参考方案3】:找到了一种替代方式,或者说是 windows 等效于 popen。它是_popen()。这对我来说很合适,而且很容易使用。
char psBuffer[128];
FILE *pPipe;
if( (pPipe = _popen( "dir", "rt" )) != NULL)
while(fgets(psBuffer, 128, pPipe))
printf(psBuffer);
通过完整示例查找详细信息here。
【讨论】:
这很好用而且很容易使用。因此,选择它作为答案。【参考方案4】:你不能。这些程序在不同的内存空间中运行,因为它们是不同的进程。通常,在现代操作系统中,进程不共享内存。
此外,在 C 中定义一个变量来保存命令的输出(例如“dir”)是很困难的;它需要动态增长以腾出空间。
最好的方法是使用a pipe,这样就可以从流中读取命令的输出,您可以根据需要存储它。
【讨论】:
【参考方案5】:使用 popen() 它完全符合您的要求。 它创建一个双向管道,分叉进程。在子进程中,它将管道连接到标准输入和标准输出,然后执行指定为 popen() 的第一个参数的命令。
#include <stdio.h>
#include <string>
#include <iostream>
int main()
std::string output;
FILE* data = popen("cat PLOP","r");
for(char c = getc(data);c != EOF;c = getc(data))
output += c;
pclose(data);
std::cout << "Data(" << output << ")\n";
【讨论】:
以上是关于如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?的主要内容,如果未能解决你的问题,请参考以下文章