2017-04-19 7 views
5

私の人生の大半は、cstdioを使っています。今度はiostreamに移行しようとしています。 「bar.cpp」と呼ばれる別のプログラムでは.exeを実行し、stdinとandをリダイレクト

int main(){ // foo.cpp 
    int x; 
    std::cin >> x; 
    std::cout << x + 5 << "\n"; 
} 

、私がfooの実行可能ファイルを呼び出します。

は、私はこのようになります「foo.cpp」と呼ばれる別のプログラムがあるとします。私は、ファイルに標準入出力をリダイレクトしたい場合は過去に、私はそうのようなfreopenを使用します。

int main(){ // bar.cpp, redirecting stdin and stdout 
    freopen("foo.in", "r", stdin); // Suppose "foo.in" contains a single integer "42" 
    freopen("foo.out", "w", stdout); 

    system("foo.exe"); // "foo.out" will contain "47" 
} 

を今、私はstringstreamsにstd::cinstd::coutをリダイレクトしようとしています。このような何か:

int main(){ // bar.cpp, redirecting cin and cout 
    std::istringstream instr("62"); 
    std::ostringstream outstr; 

    std::cin.rdbuf(instr.rdbuf()); 
    std::cout.rdbuf(outstr.rdbuf()); 

    system("foo.exe"); // outstr should contain "67" 
} 

しかし、私が学んだことは「FOO.EXE」を実行する際にstd::cinstd::coutがリダイレクトされなかったことです。プログラムはユーザー入力を期待しており、std::coutに印刷されます。 "foo.exe"の実行が完了すると、bar.cpp内のstd::cinstd::coutはまだそれぞれinstroutstrにリダイレクトされたままです。

私の質問は、私が意図したようにiostreamでそれを行う方法はありますか?freopenを使用していますか?

+1

オペレーティングシステムは、実行可能ファイルの出力の処理を担当しています。 C++言語には出力をリダイレクトする機能がありません。 –

+1

プログラム間でデータを共有するための一般的なソリューション:ファイル、ソケット、パイプ(他のプログラムの出力をプログラムの標準入力にパイプするためにOSに指示する)、共有メモリ領域。インターネットで検索。 –

+1

同じfreopenコールを試したことがありますか? – stark

答えて

1

しばらくの間freopenコールを見たことがありません。これは古い記憶を取り戻す。

とにかく、私はあなたがfreopenと付くべきだと思います。機能のdocumentationページは、文字通り、これが主な使用例1であると述べている:

この機能は、特定のファイルへSTDINSTDOUTstderrののような事前に定義されたストリームをリダイレクトするために特に有用です。

iostreamライブラリがfreopen機能のための同等のものを持っていないので、私は、あなただけiostreamでリダイレクトを行うことができるとは思いません。

あなたがしようとしたこのソリューションが動作しない理由のに面白いです:

std::cin.rdbuf(instr.rdbuf()); 
std::cout.rdbuf(outstr.rdbuf()); 

はたぶん、これら二つのラインで、あなただけの現在のプロセスからstd::cinstd::coutRDBUFに影響を与えるとサブプロセスは、別のものを持っていますstd::cinおよびstd::coutのインスタンス。

systemを呼び出すと、ファイルに関する情報が親プロセスからサブプロセスにコピーされているようです。そのため、メインプロセスのスタンダードstdoutfreopenの変更は、サブプロセスでも表示されます。

に関係なく、you should not use systemは、メインのC++プログラムからサブプログラムを実行します。あなたはおそらくWindows上にいるので(foo.exeから推測)、私はこのexampleをMicrosoftから分析します。サブプロセスの作成方法とパイプを使用して、サブプログラムの入出力をリダイレクトする方法について説明します。

0

freopenを使用しているサンプルコードでは、物理ファイルに/からリダイレクトしていますか?サンプルコードで、std :: istringstreamとstd :: ostringstreamを使用して、メモリにリダイレクトしようとしていますが、正しいですか?物理ファイルはメモリと同じではありません。メモリにはファイル記述子がありません。 Linuxではwindows - C - create file in memory - Stack Overflowのようにfmemopenを使うことができますが、std :: istringstreamやstd :: ostringstreamなどのC++標準クラスでは役に立ちませんし、stdinとstdoutをfmemopenに/からリダイレクトすることもできません.fmemopenすべてのオペレーティングシステムで利用できるわけではありません。 C++の標準クラスは、このタイプのものをサポートしていません。 c++ - Getting a FILE* from a std::fstream - Stack Overflowを参照してください。 std :: istreamとstd :: ostreamはC++インターレースレベルでstd :: istringstreamとstd :: ostringstreamのように見えるかもしれませんが、内部的には互換性がありません。

関連する問題