0

プログラムAで次のようなことを行うバッチファイルが山ほどあります。

A > log.txt ; grep 'result:' log.txt > result.txt || raise_hell.sh

私がやろうとしているのは、 A を変更して、途中で大量の中間結果を出力するようにすることです。ただし、A は次のことを行うため、思ったほど簡単ではありません。

  • _freopen("somefile","w",stdout) を呼び出し、次に
  • 百万の場所で printf (およびその変形) を呼び出し、出力が最終的に何らかのファイルになることを期待します。

プロジェクト内のすべての printf を変更するのは現実的ではありません。また、すべてのバッチ ファイルを変更するのも現実的ではないため、出力がどこにリダイレクトされているのかよくわかりません。

理想的には、 stdout の「元の値」に到達し、そこに書き込む方法が必要です。しかし、どのように?出力が本来あるべき場所で終わる限り、freopen の呼び出しを別のものに置き換えることさえできます。

言い換えれば、printf がファイルに出力され、他の方法で標準出力に出力されるようにしたいと考えています。

この質問のバリエーションへの回答に基づいて、いくつかのことを試しました。ただし、それらはすべて何らかのファイルに書き込むことになるため、どれも機能しません。助けを歓迎します。

edit : 明確にするために、これは Windows で、Visual Studio 2010 を使用しています。

4

1 に答える 1

2

OK、私はWindowsの男ではありませんが、特定の質問への答えとして、stdoutを台無しにする方法です。UNIX では、次のように dup/dup2 を使用します。

http://www.suacommunity.com/dictionary/dup-entry.php

Windows ではわずかに異なります。UNIX の基本的な考え方は、stdout はファイル記述子 1 であるということです...そこで開いているものを変更することは、それをリダイレクトすることと同じです。dup を使用すると、元に戻したい場合に備えて、最初にコピーを作成できます。

ただし、一般的には、進行状況メッセージに stderr を使用します...それが存在する理由です。

于 2012-09-05T20:48:30.323 に答える