3

何らかの理由で、何も指していないファイル ポインター (FILE*) が必要です。これは、それを fprintf 関数に渡すことができ、fprintf はファイル ポインターを無視できることを意味します。

例えば:

void my_function()
{
  FILE* nothing = NULL; // NULL is not correct.
  int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}

何も指していないファイル ポインタ (FILE*) はありますか?

4

6 に答える 6

8

実際の問題 (コメントに記載) を解決するには、C++ 実装で使用できる場合 (C++03 では保証されていません)、snprintf代わりに を使用します。printfバッファーには null ポインターを渡し、サイズには 0 を渡します。何も書き込まれませんが、戻り値は書式設定された文字列の長さです (ヌル ターミネータを除く)。

snprintf[編集: おっと、 Windows では C99 に準拠していないことを忘れていました。必要な長さではなく、切り捨てが発生した場合はエラーを返します。C++0x には C99 準拠が必要であるという事実について、彼らが何をしようとしているのか私にはわかりませんsnprintf。]

あなたの質問に答えるには、/dev/nullUNIX ライクなシステムまたはnulWindows で fopen を実行できます。結果への書き込みFILE*は効果がありません。ただし、ポータブル null デバイスはありません。

于 2011-09-12T08:35:42.513 に答える
6

いいえ。

コードによって実行時例外が発生します。/dev/nullたとえば、それをサポートするOSで実行している場合に使用できますが、C ++には組み込みのようなものはありません。

于 2011-09-12T08:12:27.640 に答える
0

あなたは設計ミスをしています。

明らかに、知りたいのは、数値を書き込むのに必要な文字数です。

そのために _*printf_ を使用していますが、これは良い考えです。「書き込まれた」文字数を計算したいだけなので、必要です。しかし、何も表示したくないので、単にprintfの代わりにfprintfを刺しました。しかし、fprintfは、書き込むファイルがないと機能しません...

スティーブが言ったように、メモリ内の文字列に書き込むsnprintf()を使用する必要があります。

スティーブが言うように、NULL 文字列を指定したsnprintfは、Windows 以外では意図したとおりに動作するはずです。次に、Windowsでは、後で破棄する一時的な文字列を提供するだけです。

size_t computeNumCharsNeededToPrintMyStuff(double d)
{
    size_t ret = 0;
    size_t maxBuffSize = 100; // should be plenty enough

    char *tmpBuff = new char[maxBuffSize ];
    ret = snprintf(tmpBuff, maxBuffSize, "PI = %f", d);
    delete[] tmpBuff;

    return ret;
}

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

n = computeNumCharsNeededToPrintMyStuff(3.14)

(この関数は、何かを表示するのに必要なサイズを計算するように拡張できますが、今のところは単純にしたいと思います。)

于 2011-09-12T10:15:22.983 に答える
0

fprintf メソッド呼び出しをif (NULL != nothing)ステートメントでラップしないのはなぜですか?

于 2011-09-12T08:12:21.383 に答える
0

NirMH の言う通り、 で囲むこともできますがif (nothing != NULL)、別の方法もあります。ファイルを読み取りモードで開くことができ ( を使用"r")、ファイルを に送信するとfprintf、書き込みは無視されます (編集: コメントで説明されているように、n=0によって返される負の値であった場合は忘れずに設定してfprintfください)。

私は個人的に最初の方法をお勧めします。2 番目の方法を実行する唯一の理由は、関数を変更できない場合です。

コードがシステムに依存しているかどうか気にしない場合は/dev/null、Linux、nulWindows などで使用できます。

于 2011-09-12T08:37:31.450 に答える