非常に類似した質問はすでにここに頼まれた: Writing to both terminal and file c++C++は - コンソール出力を維持しながらファイルに標準出力/標準エラー出力を複製
をしかし、良い答えなし。すべての答えは、カスタムストリームを使用するか、std :: coutを複製することを提案しています。しかし、私はstdout/stderrの動作が必要です。
欲しいもの:stdout/stderrへの書き込みごとに、これをコンソールに表示して、ファイルにリダイレクトします。
私はファイルへの書き込みをパイプに標準出力をリダイレクトについて、そこから考えて、コンソールました - この答えにhttps://stackoverflow.com/a/956269/2308106
を拡大するには、これに任意のより良い方法はありますか?
EDIT1:なぜカスタムストリームではなく、stdout/stderrであるのですか?
私は変更できず、自分のプロセス内でホストされている(第三者)コードを呼び出しています。だから私はカスタムストリームを使用することはできません(呼び出されたコードはすでにstderr/stdoutに書き込まれています)。
EDIT2:いくつかの問題しかし
HANDLE hPipe = ::CreateNamedPipe(TEXT("\\\\.\\pipe\\StdErrPipe"),
PIPE_ACCESS_OUTBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_BYTE,
//single instance
1,
//default buffer sizes
0,
0,
0,
NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
//Error out
}
bool fConnected = ConnectNamedPipe(hPipe, NULL) ?
TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
if (!fConnected)
{
//Error out
}
int fd = _open_osfhandle(reinterpret_cast<intptr_t>(hPipe), _O_APPEND | /*_O_WTEXT*/_O_TEXT);
if (dup2(fd, 2) == -1)
{
//Error out
}
がまだある - 私は受信パイプのもう一方の端から通り:私は私の実装(Windows)を試してみましたJVOからの提案に基づき
rubish(私は最初に何かをdirrectly送信しようとする - それは素晴らしいですが、stderrがリダイレクトされ、それに書き込むと、パイプは同じnonininble文字を何度も受け取ります)
リンク先の最初の質問では、上位回答が2つの出力を行う単純な関数であることに気づくでしょうか? 1つはファイルに、もう1つは 'std :: cout'ですか?あなたはそれを同じように解決できませんか?呼び出す関数を作成すると、ファイルと 'stdout'の両方に書き出しますか? –
カスタムストリームが悪いのはなぜですか?既存のソリューションで何が問題になっていますか? 「ostream」の一部ではないので、あなたは好きではないでしょうか? – AndyG
また、あなたは 'stdout'や' stderr'に書き込む必要性について詳しく説明できますか?あなたは変更できないC関数をいくつか呼びますか?あなたが解決しようとしている*実際の*と*元の*問題は何ですか? [XY問題について読む](http://xyproblem.info/)と、それがあなたの質問にどのように関係するかを考えてください。 –