2014-01-11 28 views
2

我試圖在Windows上使用以下代碼捕獲系統命令,以便將輸出作爲字符串返回。從FILE結構解析爲C++中的字符串

std::string exec(char* cmd) { 
    FILE* pipe = _popen(cmd, "r"); 
    if (!pipe) return "ERROR"; 
    std::ifstream ifs(pipe); 
    std::string content((std::istreambuf_iterator<char>(ifs)), 
         (std::istreambuf_iterator<char>() )); 
    printf("%s", content); 
    return content; 
} 

當我調用該函數是這樣的:

char *command = "set"; 
std::string results = exec(command); 
printf("%s", results); 
getchar(); 

輸出是短短隨機字節。

╝÷:ö°: 

我試圖讓所有的結果附加在1個長字符串中。誰能告訴我我做錯了什麼? 我嘗試重定向stderr輸出與命令,但它也給一些隨機字節。

+0

會,即使編譯?在帶有'FILE'指針的標準庫中沒有['std :: ifstream'構造函數](http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream)。 –

回答

2

由於您使用printf()其中一無所知C++ std::string值,您需要打印content的C字符串表示:

printf("%s", content.c_str()); 

printf()功能被告知要想到的是,但那一點都不你傳遞給它的東西。

或者,正如其他人所指出的,你應該使用本地C++ I/O:

std::cout << content; 
+0

Thansk很棒!我正在尋找完全錯誤的地方。 –

0

printf的期望C字符串,char*

使用

printf("%s",results.c_str()); 
0

不要使用printf,使用C++而不是標準輸出流:

std::cout << content << '\n';