2010-11-22 4 views

答えて

17

あなたは(ないCまたはPOSIXで、GNU拡張)dprintfになります:

関数DPRINTF()とvdprintf() は(glibc2ではライブラリに見られるような) 正確な類似体でありますfprintf()と vfprintf()は、 指定されたストリームの代わりに にファイル記述子fdを出力します。

EDITコメントであなたのいくつかで指摘したように、POSIX 2008は、これらの機能を標準化しました。

+0

ありがとうございました!非常に興味深い、それらが存在することを知らなかった。 –

+0

私はこのアプリはLinux上でしか動作しないので、これが私の必要なものかもしれません。クロスプラットフォームの互換性は問題にならないので、GNU拡張モジュールを使用すると問題はありません。 – Will

+2

マニュアルページに、現在POSIX.1-2008に入っていると書かれています。 – nategoose

2

いいえ、標準ではありませんが、2つの異なることを行います。 fprinftはstdioの一環として、バッファの読み書きのような処理を行い、ungetcなどをサポートします。fdを使用すると、すべてが無視され、OSが直接呼び出されます。

したがって、これらは互換性がありません。ファイルディスクリプタにprintfを行うにはCやPOSIX標準の機能はありません他の

+0

それは私が思ったものですが、100%確実ではありませんでした。 – Will

+0

...あなたは 'fdopen'を行うことができ、必要に応じて' flush() 'を覚えている限り、フリップフロップはうまく動作します。 –

+0

おそらく、保証はされていませんが、あなたが別のポジションを狙うならおそらく動作しません。 –

6

何もない場合は、それらの間のフリップばたつきはstdioのバッファリングを台無しだろうが、あなたはfdopen(int desc, const char *mode) POSIX標準でFILE *としてファイルディスクリプタを「開く」ことができます。私は、ディスクリプタを直接使用することにどのくらいうまく対応しているのか分かりませんが、まずバッファをフラッシュすれば動作するかもしれませんね...

もちろん、vsprintf明らかにあなたはバッファリングの世話をする必要があります。

+1

私はfdopenを考えていましたが、実際には別のハンドルを "開く"ことは望ましくありません。特にIIRCがそのハンドルでfcloseを呼び出すと、基礎となるファイル記述子も閉じます。ルーチンがファイル記述子またはソケットハンドルのいずれかを取得する可能性があるため、これは私が作業しているコードの問題です。 – Will

+4

@Will: 'dup'から取得したファイルを' fdopen'することができます。その結果、元のfdには影響しません – Hasturkun

+1

@Hasturkun:そうです、私はdupを忘れました。私が定期的に使用する機能の1つではありません。 – Will

1

fprintf()で処理できる通常のファイルとしてファイルディスクリプタを開くことができます。ファイル名はfdopenです。何が価値があるために

2

dprintfはPOSIX関数ではありませんので、移植性が問題になる場合、1は以下を使用することができます。

#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 *ルーチンのようにバッファしません。私は、書式指定子と、書かれているときにデータをバッファリングすることを心配するのではなく、ファイル記述子に書き込まれる文字データを構築する機能を探していました。

+2

'dprintf'はPOSIX(2008年現在)であり、データを静かに切り捨てる関数は通常非常に悪い考えです。成功するか、失敗を返すまで、大きなバッファで少なくともループしてください... –

+0

これはクールです。私のgccのバージョンは少し古いですが、 'dprintf'はまだGNU拡張だけであると表示されます。 – Will

関連する問題