たぶん私はそれを見逃しているだけかもしれませんが、ファイル記述子の fprintf に相当する関数、またはそれらの間で一時的にフリップフロップする方法さえありませんか?
5 に答える
dprintf
(CまたはPOSIXではなく、GNU拡張機能)を調べることができます:
関数 dprintf() および vdprintf() (glibc2 ライブラリーにある) は、fprintf() および vfprintf() とまったく同じですが、特定のストリームではなくファイル記述子 fd に出力する点が異なります。
EDITコメントで何人かが指摘したように、POSIX 2008はこれらの機能を標準化しました。
ファイル記述子に対して実行する C または POSIX (編集: 2008 年より前) の標準関数はありませんが、POSIX 標準を使用してprintf
ファイル記述子を として「開く」ことができます。ディスクリプタを直接使用するように戻すことがどの程度サポートされているかはわかりませんが、最初にバッファをフラッシュするとうまくいくかもしれません…</p>
FILE *
fdopen(int desc, const char *mode)
もちろん、 のようなものを使用して独自に実装することもできますvsprintf
が、明らかにバッファリングを処理する必要があります。
価値があるのdprintf
は、POSIX関数ではないため、移植性が問題になる場合は次を使用できます。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
int
fdprintf ( int fd, size_t bufmax, const char * fmt, ... )
{
char * buffer;
int n;
va_list ap;
buffer = ( char * ) malloc ( bufmax );
if ( !buffer )
return 0;
va_start ( ap, fmt );
n = vsnprintf ( buffer, bufmax, fmt, ap );
va_end ( ap );
write ( fd, buffer, n );
free ( buffer );
return n;
}
ほとんどの場合、 の戻り値を確認する必要write
がありますが、一般的な考え方は理解できます。明らかに、これはFILE *
ルーチンのようにバッファリングしません。私は、フォーマット指定子と、ファイル記述子に書き込まれる文字データを作成する機能をもっと探していました。書き込み中のデータのバッファリングについて心配するのではありませんでした。
fprintf()
ファイル記述子は、fdopenで処理できる通常のファイルとして開くことができます。
いいえ、標準ではありませんが、2 つの機能は異なります。fprinft は、stdio の一部として、バッファの読み取りと書き込みなどを行い、ungetc をサポートします。fd を使用すると、これらすべてがバイパスされ、OS が直接呼び出されます。
したがって、それらは交換可能ではありません。それらの間のフリップフロップは、他に何もない場合、標準入出力バッファリングを台無しにします