2017-06-18 3 views
2

私は別のプロセスを開いて出力を得る必要があるアプリケーションを作成しています。どこでもオンラインで読むことができます。私はpopenを使用してファイルから読む必要があります。 しかし、私はそれを読むことができません。コマンドの出力は、呼び出し元のアプリケーションのコンソールウィンドウに出力されます。以下は私が使用しているコードです。私はデバッグするためにいくつかのプリントを追加しました。popen()はcoutに実行されたコマンドの出力を書き込みます

#include <string> 
#include <iostream> 
#include <cstdlib> 
#include <cstdio> 
#include <array> 

int main() 
{ 
    // some command that fails to execute properly. 
    std::string command("ls afskfksakfafkas"); 

    std::array<char, 128> buffer; 
    std::string result; 

    std::cout << "Opening reading pipe" << std::endl; 
    FILE* pipe = popen(command.c_str(), "r"); 
    if (!pipe) 
    { 
     std::cerr << "Couldn't start command." << std::endl; 
     return 0; 
    } 
    while (fgets(buffer.data(), 128, pipe) != NULL) { 
     std::cout << "Reading..." << std::endl; 
     result += buffer.data(); 
    } 
    auto returnCode = pclose(pipe); 

    std::cout << result << std::endl; 
    std::cout << returnCode << std::endl; 

    return 0; 
} 

実際には読みがmy coutに出力されることはなく、結果は空の文字列です。私は明らかに私の端末でコマンドの出力を見ています...コマンドが正常に終了した場合、その動作は期待通りです。しかし、私はエラーの場合のみ出力をキャプチャします。

私は誰かが助けることを願っています!

+0

あり

command.append(" 2>&1"); 

コマンド文字列の末尾に "2> & 1" を追加する必要があります'fgets()'がファイルの最後に 'NULL'を返すので、あなたのケースでは無意味です。人々が問題を再現するために使用できる[mcve]を提供してください。問題の内容がわからない場合は、重要な情報を除外するための良い方法です。実行しているコマンドが、あなたの技術を使ってリダイレクトできない出力手段を使用している可能性があります。 – Peter

+0

@ Peter 完全な例が提供されています。私は文字通りint mainを追加し、ハードコードされたコマンドを追加しました... –

答えて

0

Popenはstderrのみstdoutをキャプチャしません。 stderrをstdoutにリダイレクトすると、問題が修正されます。

#include <string> 
#include <iostream> 
#include <cstdlib> 
#include <cstdio> 
#include <array> 

int main() 
{ 
    std::string command("ls afskfksakfafkas 2>&1"); 

    std::array<char, 128> buffer; 
    std::string result; 

    std::cout << "Opening reading pipe" << std::endl; 
    FILE* pipe = popen(command.c_str(), "r"); 
    if (!pipe) 
    { 
     std::cerr << "Couldn't start command." << std::endl; 
     return 0; 
    } 
    while (fgets(buffer.data(), 128, pipe) != NULL) { 
     std::cout << "Reading..." << std::endl; 
     result += buffer.data(); 
    } 
    auto returnCode = pclose(pipe); 

    std::cout << result << std::endl; 
    std::cout << returnCode << std::endl; 

    return 0; 
} 
関連する問題