2017-11-02 5 views
-2

STDOUTとSTDINを関数にリダイレクトする方法を研究するのに時間を費やしました。C++ STDINを関数にリダイレクトする方法

私は最終的にSTDOUTをコールバックにリダイレクトすることに成功しましたが、STDINをコールバックにリダイレクトすることはできません(STDINをファイルにリダイレクトする以外のリソースは見つかりません)。

ありがとうございます。

編集: 私はWindowsフォームでカスタムコンソールを作ったので、私はメインプログラムにパイプで接続しました。私はすでにこれを使用して、そこから印刷して読むことができます:

Console::PrintLn("Hello World!"); 
std::string in; 
Console::ReadLn(in); 

をしかし、私の目標は、例えば、この使用していた:だから

std::string str; 
std::cin >> str; // Read string from custom console 
std::cout << str << std::endl; // Print string to custom console 
std::printf("Hi!"); // It should also work with printf 
+2

どういう意味ですか? "redirect" _ ??あなたの関数で単に 'STDOUT'と' STDIN'を使うことはできませんか? – user0042

+0

申し訳ありませんが、私の質問を明確にしました。 –

+0

「あなたの関数でSTDOUTとSTDINを使うだけではどういう意味ですか?それを少し明確にしていただけますか? –

答えて

1

を、私はあなたがクロスでこれを行うことができると信じていませんプラットフォームの方法。

基本的には、stdinstdoutの代わりに、実際に入出力を行う代わりに、コンソールの入出力ルーチンを呼び出します。

これは、ほとんどが正確には可能ではありません。その理由の一部は、stdinとstdoutを置き換えても十分ではありません。 stdinとstdoutをさらに直接的に操作しようとするプログラムの部分があるかもしれません。

Unixシステムでは、スレッドとパイプまたはソケットペアでこれを解決します。そして、私はdup2システムコールを使用してファイル記述子0と1を置き換えます。それは、非常に難しい(基本的には/dev/ttyを開き、目的に応じて出力しなければならない)限り、プログラムをコンソールからバイパスできないことを確認します。

Windowsでは、この問題を完全に解決するために何をすべきかわかりません。 freopenを使用して、stdinstdoutを置き換えることができます。これは、標準のライブラリ呼び出しを使用するため、ほとんどのコードで機能します。 cincoutは実際にはCのstdioを使用しているため、別のスレッドで実行されているCコードとの相互運用が可能です。

FILE *のVisual C/C++バージョンstdioライブラリにIOをコールバックにリダイレクトできるものが含まれているかどうかはわかりませんので、Windowsの同等のパイプを使用する必要がありますこの作品。

coutcinを置き換えたい場合は、streambufオブジェクトを自分のものに置き換えて、おそらく実行可能です。私はこの作業の仕方を正確には分かっていませんが、cincoutオブジェクトのrdbuf member functionsを見てください。

streambufを実装するのは難しくありません。私はちょうどこれを自分でしなければならなかった。残念ながら、私がここで取り組んでいることの詳細については、特にコードには何も含まれていませんが、コードはまだ独占的なので、貼り付けることはできません。しかし、これの多くの例がvarious code samples from a Josuttis book on the C++ standard libraryにあります。

具体的には、underflow(入力用)とoverflow(出力用)の関数がオーバーロードされ、完全にバッファリングされていないstreambufがあります。

+0

答えをありがとう。あなたが言っていることによると、私はSTDINとSTDOUTで必要なものを実装するのに問題があります。だから、単にstd :: coutとstd :: cinをリダイレクトするのはどうですか? –

+1

@RicardoAntunes: 'cout'と' cin'のやり方で更新されました。 – Omnifarious

+1

@RicardoAntunes:もう少し詳しく説明します。 :-) – Omnifarious

関連する問題