我试图编译下面的代码(来自/sf/answers/33527231/).编译运行正常,如果我编译
$ g++ test.cpp
Run Code Online (Sandbox Code Playgroud)
但在使用-std=c++11开关时出错了:
$ g++ -std=c++11 test.cpp
test.cpp: In function 'std::string exec(char*)':
test.cpp:6:32: error: 'popen' was not declared in this scope
FILE* pipe = popen(cmd, "r");
^
Run Code Online (Sandbox Code Playgroud)
知道发生了什么事吗?
(我在mingw.org和WindowsXP64上使用mingw32 gcc4.8.1)
码:
#include <string>
#include <iostream>
#include <stdio.h>
std::string exec(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
int main() {}
Run Code Online (Sandbox Code Playgroud) popen()在执行进程后,C++ 将返回包含输出的文件描述符.而不是FILE*,我需要一个char*,即.一个字符串作为我的输出.我该怎么办?请帮我.
背景:
我的工作需要能够捕捉程序stdout,stderr并返回程序的值.理想情况下,我想在我存储在我的对象中的字符串中捕获这些字符串,该字符串包含进程的详细信息.我目前有一些代码,通过使用一些(在我看来)古老的C文件句柄魔术将输出保存到文件中.任何时候我想输出结果,我打开该文件,然后打印内容.
有时(当我生成的进程继续运行时)我的可执行文件的下一次执行将会中断,因为它无法打开文件进行写入.
问题陈述:
我正在寻找一种方法来将stdout窗口中创建的进程的输出保存为一个字符串,并stderr以更安全,更现代的方式保存到另一个字符串.这样我就可以在每次输出每个创建过程的结果时打印这些内容.
我丑陋的代码:
主要块 -
int stdoutold = _dup(_fileno(stdout)); //make a copy of stdout
int stderrold = _dup(_fileno(stdout)); //make a copy of stderr
FILE *f;
if(!fopen_s(&f, "name_of_my_file", "w")){ //make sure I can write to the file
_dup2(_fileno(f), _fileno(stdout)); //make stdout point to f
_dup2(_fileno(f), _fileno(stderr)); //make stderr point to f
fork("command_I_want_to_run", &pi); //run my fake fork (see below)
}
else{
...//error handling
}
_close(_fileno(stdout)); //close tainted stdout
_close(_fileno(stderr)); //close …Run Code Online (Sandbox Code Playgroud) 如何查看系统命令的输出.例如:
int _tmain(int argc, _TCHAR* argv[]) {
system("set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin");
system("cd C:/thisfolder/");
std::cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在Visual Studio中运行程序时,它给我一个黑屏,我看不到正在运行的命令.我需要它,所以我可以查看它是否有效.谢谢!
我需要编写C代码来检查文件是文本(ASCII)还是二进制文件
有人可以帮忙吗?谢谢
给出以下答案(第一个c ++ 11答案):
以下是您的实施方便:
#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <array>
std::string exec(const char* cmd) {
std::array<char, 128> buffer;
std::string result;
std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
if (!pipe) throw std::runtime_error("popen() failed!");
while (!feof(pipe.get())) {
if (fgets(buffer.data(), 128, pipe.get()) != nullptr)
result += buffer.data();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这非常适合执行命令(例如std::string res = exec("ls");)并将stdout转换为字符串.
但它没有做的是获取命令返回码(通过/失败整数)或stderr.理想情况下,我想要一种方法来获取所有三个(返回代码,stdout,stderr).
我会满足于stdout和stderr.我想我需要添加另一个管道,但是我无法真正看到第一个管道是如何设置来获得stdout所以我无法想象我将如何更改它以获得两者.
任何人都有任何想法如何做到这一点,或可能有效的替代方法?
更新
看到我的完整的例子这里 witht输出:
Start
1 res: /home
2 res: stdout
stderr
3 res:
End
Run Code Online (Sandbox Code Playgroud)
您可以看到它3 res:不会以相同的方式打印stderr …
我想知道是否有一个跨平台(Windows、Linux、BSD)库,我可以用它异步启动一个进程,并iostream为其标准管道提供类似的包装器。
我希望它能够知道进程何时终止。
谢谢。
我希望我的C++程序在Windows中执行另一个.exe.我该怎么做?我正在使用Visual C++ 2010.
这是我的代码
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int input;
cout << "Enter 1 to execute program." << endl;
cin >> input;
if(input == 1) /*execute program here*/;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 自Android L NDK起__system_property_get删除(https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/keQP6L9aVyU).Android L NDK中是否有另一个API可以访问相同的属性值?
我正在使用系统 api 启动一个命令(我可以将这个 api 与C/C++一起使用)。我传递的命令有时可能会挂起,因此我想在特定超时后终止。
目前我将它用作:
system("COMMAND");
Run Code Online (Sandbox Code Playgroud)
我想像这样使用它:
使用独立于系统的 API 运行命令(我不想使用 CreateProcess,因为它仅适用于 Windows)如果它在“X”分钟后没有退出,则终止该进程。