質問
使用したい理由はありますか (構文上の理由以外)
FILE *fdopen(int fd, const char *mode);
または
FILE *fopen(const char *path, const char *mode);
の代わりに
int open(const char *pathname, int flags, mode_t mode);
Linux環境でCを使用する場合?
解決
まず、使用する特別な理由はありません。 fdopen
もし fopen
はオプションであり、 open
他の可能な選択肢です。使うべきではなかった open
必要な場合は、最初にファイルを開きます FILE *
. 。だからそれを含めて fdopen
このリストの は他のリストとあまり似ていないため、不正確で混乱を招きます。ここでの重要な違いは C 標準との違いであるため、ここでは無視します。 FILE *
OS 固有のファイル記述子。
使用する主な理由は4つあります fopen
の代わりに open
.
fopen
バッファリング IO が提供され、実際に実行しているものよりもはるかに高速になる可能性があります。open
.fopen
ファイルがバイナリ モードで開かれていない場合に行末変換を実行します。これは、プログラムが非 Unix 環境に移植される場合に非常に役立ちます。- あ
FILE *
を使用する能力を与えますfscanf
およびその他の標準入出力機能。 - いつかあなたのコードを、ANSI C のみをサポートし、
open
関数。
私の意見では、行末の翻訳は役立つというよりも邪魔になることが多く、 fscanf
あまりにも弱いので、より便利なものを選んで必然的にそれを放棄することになります。
C をサポートするほとんどのプラットフォームには、 open
関数。
バッファリングの問題は残ります。主にファイルを順次読み書きする場合、バッファリングのサポートは非常に役立ち、速度が大幅に向上します。しかし、ファイルにデータが存在すると予想したときにデータが存在しないという興味深い問題が発生する可能性があります。覚えておく必要があります fclose
または fflush
適切なタイミングで。
シーク (別名) を行っている場合 fsetpos
または fseek
2 番目の方法は、標準に準拠した方法で使用するのが少し難しくなります)、バッファリングの有用性はすぐに低下します。
もちろん、私の偏見は、ソケットを扱うことが多いということであり、実際にはノンブロッキング IO を実行したいという事実があります。 FILE *
合理的な方法でサポートすることはまったくできません)バッファリングがまったくなく、複雑な解析要件がしばしばあるため、私の認識は非常に変わります。
他のヒント
の Cで開い対のfopen の
fopen
はのシステムコールするである 1)open
はののライブラリ関数である。
2)fopen
はを提供する高速の非のバッファリングされている。
open
と比較されるIO ]を緩衝
3)fopen
はの携帯の一方open
ないの携帯する(のオープンである環境特定する)。
4)fopen
はののファイル構造(ファイル*)へのポインタを返します。 open
ファイルを識別する整数を返します。
5)FILE *
はあなたにfscanfはののやその他のstdio関数を使用する能力を提供します。
FILE *
を持っている場合は、あなただけのファイル記述子を持っている場合は、、あなたはfscanf
、fprintf
とfgets
などのような関数を使用することができ、あなたが限られている(しかし、そう速い)入力および出力ルーチンread
、write
など。
open
を使用すると、実際のパフォーマンス上の利点であるアプリケーションの0.1%の一部でない限り、、本当にfopen
を使用しない手はないでしょう。あなたはファイルディスクリプタで遊んでいない場合に限りfdopen
が懸念しているとして、あなたはその呼び出しを必要としません。
fopen
と(らfwrite
、fread
、fprintf
、)メソッドのその家族と一緒に固執すると、あなたは非常に満足するでしょう。ただ、重要なこととして、他のプログラマは、コードに満足されます。
開い使用すると、書き込みはあなたが信号interaptionsを心配しなければならないことを意味、読みます。
呼び出しがシグナルハンドラによって中断された場合は、の関数は-1を返します そしてEINTRをerrnoに設定します。
だから、ファイルをクローズするための適切な方法は以下のようになります。
while (retval = close(fd), retval == -1 && ernno == EINTR) ;
のオープン()のののfopen()の家族機能の各々の端部に呼び出されます。 のオープン()のシステムコールであるとのはfopen()の使用を容易にユーザのラッパー関数としてライブラリによって提供される
open()
は、システムコールやUnixベースのシステムに固有のものであり、それはファイルディスクリプタを返します。あなたは別のシステムコールであるwrite()
を使用してファイルディスクリプタに書き込むことができます。
fopen()
は、ファイルポインタを返すANSI C関数呼び出しであり、それは他のOSに移植可能です。私たちは、fprintf
を使用してファイルポインタに書き込むことができます。
UNIXの場合
あなたが使用してファイルディスクリプタからファイルポインタを取得することができます:
fP = fdopen(fD, "a");
あなたが使用してファイルポインタからファイルディスクリプタを取得することができます:
fD = fileno (fP);
フラグが開くように要求されているかにも依存します。上記論じたように書き込み及び読み出し(および移植)のF *の使用に関しては、使用されるべきである。
しかし、基本的に標準フラグより指定(RWなどとフラグを追加)したい場合、あなたは(POSIXのようなオープン)プラットフォーム固有のAPIまたはこれらの詳細を抽象化ライブラリを使用する必要があります。 C-標準は、そのようなフラグを持っていません。
たとえば、あなたはそれが終了した場合にのみ、ファイルを開きたいかもしれません。あなたが作成するフラグを指定しない場合はファイルが存在している必要があります。あなたが作成する排他追加した場合、それが存在しない場合は、それだけでファイルを作成します。より多くのがあります。
Linuxシステムで例えばSYSFSを通して露出LEDインタフェースがあります。これは、ファイルを介してつながっの明るさを公開します。 0〜255の範囲内の文字列として番号を書き込みまたは読み出し。もちろん、そのファイルを作成し、それが存在する場合にのみ、それへの書き込みをしたくありません。今クールなこと:使用のfdopen標準呼び出しを使用して、このファイルを読み出し/書き込みする
。私は、二重、私はfopenをfgetc関数を実行するたびに読み込み、自分のアプリケーションのための)(のfopenから)(開くように変更しました。ダブルは、私が達成しようとしたものの破壊的だった読み込みます。ちょうどあなたがそれを聞いて何をやっているようだ)(オープンます。
を使用してファイルを開く フォーペン
ディスク上のファイルから(またはファイルに)情報を読み取る(または書き込む)前に、ファイルを開く必要があります。ファイルを開くには、関数 fopen を呼び出します。
1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.
これが人の行動様式です フォーペン 関数
バッファリング処理中に何らかの原因によりタイムアウトになる場合があります。それで比較しながら フォーペン(高レベル I/O) から 開ける (低レベル I/O) システム コールであり、より高速で適切です。 フォーペン.