1

私たちは、コンソール上で多くのコメントを生成する複雑なコンソールベースのツールを構築しています。これらのツールは大量のデータを処理するため、実行にはコストがかかり、必要以上に頻繁に実行することは望ましくありません。特に、既に繰り返し実行する必要があるテスト中はそうです。このようなテスト中に、結果をファイルに記録して、検査のためにこのコメントをキャプチャすることがよくあります。 C:> [ourcommand] >log.txt アプリケーションが最後まで実行されると、これはうまく機能します。

アプリケーションがクラッシュした場合 (不正なメモリ参照など)、Windows はログ ファイルをコメンタリーの末尾の前で切り捨ててしまうので、クラッシュの時点で何が起こっていたのかわかりません。また、同じ場所でコンソール出力をチョップします。そのため、切り捨てられたログ ファイルを取得した場合、最終的な回答を確認するには、ログ ファイルを使用せずにすべてをやり直す必要があります。ログを記録しない場合、Windows はコンソール出力をバッファリングしないようです。

ログ中にコンソール出力をバッファリングしないように Windows に指示する方法はありますか? 私たちのアプリケーションは (Windows) C ランタイム システムを使用しており、しばらく前に次のように "setvbuf" を使用しました。しかし、役に立たない。

4

3 に答える 3

2

コンソールのバッファはいつでもフラッシュできます。

Console.Out.Flush();

これはTextWriter.Flush()を使用します。

これが常に発生することを確認する必要がある場合は、WriteLine のように機能し、最後にフラッシュ ステートメントを含むコンソール用のメソッドを作成するのはかなり簡単です。


編集:

言語を指定していませんでした... C# を使用して例を記述します。

C# では、次のようなメソッドを提供する静的ユーティリティ クラスを簡単に作成できます。

public static class FlushingConsole {
    public static void WriteLine(string format, params Object[] args) {
        Console.WriteLine(format, args);
        Console.Out.Flush();
    }
    // Add other overloads as required
}

次に、次のように呼び出します。

FlushingConsole.WriteLine(....);

同じアプローチは、他のほとんどすべての言語でも機能するはずです。


編集2:

C++ を使用しているため、setvbuf 以外に興味深いオプションがいくつかあります。

まず、次のようにして cout のバッファリングをオフにできるはずです。

cout.unsetf(ios_base::unitbuf);

sync_with_stdiostdio (つまり、printf) と iostream を混在させている場合は、設定が必要になる場合もあります。

于 2009-07-03T16:48:40.303 に答える
1

言語を指定しませんでしたが、C++ の場合、stdout を最初のパラメータとしてsetvbufを呼び出してバッファリングをオフにできるはずです。

于 2009-07-03T16:50:22.737 に答える
1

標準出力を使用しているようです。「標準エラー」を使用することをお勧めします。(C ライブラリの stderr、iostream の cerr) これらはバッファリングされません。または、同期するたびに FlushFileBuffers (またはアナログ) を使用できます。

于 2009-07-03T16:50:50.943 に答える