ファイル記述子からFILEポインタを取得するにはどうすればよいですか?


85

mkstemp()ファイル記述子を提供する、で遊んでいますが、を介してフォーマットされた出力を生成したいと思いますfprintf()。によって提供さmkstemp()れるファイル記述子FILE *をでの使用に適した構造に変換する簡単な方法はありますfprintf()か?


回答:


101

使用fdopen()

FILE* fp = fdopen(fd, "w");

34
また、FILE *からファイル記述子を取得するには、次を使用しfileno()ます。linux.die.net
Lee Netherton

2
fdいくつかのフラグ(のようなO_NONBLOCK)で開かれた場合-fdopen新しいフラグで開いた後、それらはどうなりますか?それらはxor一緒に使用されますか、それとも置き換えられますか?
xealits 2015年

5
@jww:ファイル記述子はそもそもANSICではありません。
Rufflewind 2016年

2
fdopen何度も電話をかけるのは悪いことですか?(何度も呼び出される関数内で発生すると仮定)
phil294 2017

2
@xealits FILE *のオプションは、すでに開いているファイル記述子の範囲内にある必要があります。したがって、fdを読み取り専用で開き、FILE *を書き込み専用で開いた場合は、例外がスローされます。詳細については、ibm.com
support / knowledgecenter / en / SSLTBW_2.2.0 /…を

28

FILE* f = fdopen(d, "w");

man fdopen出力:

概要

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

このfdopen()関数は、ストリームを既存のファイル記述子に関連付けますfildes。ストリームのモードは、ファイル記述子のモードと互換性がある必要があります。を介してストリームが閉じられるとfclose(3)fildesも閉じられます。


1
ANSI Cでは使用できません
JWW


-8

C標準はファイル記述子について何も言っていないので、これを行う標準的な方法(またはその逆)はありません。特定のプラットフォームがそのようなメカニズムを提供する場合と提供しない場合があります。


17
「標準」の意味によって異なります。POSIXが標準です。
リチャードペニントン

12
問題はファイル記述子についてでした。;-)
リチャードペニントン

11
@Neil> Cとしてタグ付けされている質問は、「C標準についての完全な真実を教えてください」という意味ではなく、「Cでコーディングしているので、これが失敗します。それが可能かどうか、どのようにしたらよいか教えてください。 「」
グレゴリーパコス2009

8
これを行う標準的な方法がないことに同意しますが、OPの言及はmkstemp、この特定のインスタンスでは非標準のソリューションが受け入れられることを意味します。ただし、その場合は、posixタグを追加する必要があります(その後追加されたようです)。
Emerick Rogul

9
@ニール、そしてネットの目的と人生の意味。あなたが異なる意見を持っていると言ったなら、あなたはもっと理にかなっているでしょう。私はまた、SOがすべて標準を超えたヘアスプリットについてであるとは思えません。そして、それは23の評判に対応SO-経験を持つ人のスキルをタグ付けに依存することは非常に実用的ではありません
ハッカー-マイケルKrelin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.