質問

使用したい理由はありますか (構文上の理由以外)

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.

  1. fopen バッファリング IO が提供され、実際に実行しているものよりもはるかに高速になる可能性があります。 open.
  2. fopen ファイルがバイナリ モードで開かれていない場合に行末変換を実行します。これは、プログラムが非 Unix 環境に移植される場合に非常に役立ちます。
  3. FILE * を使用する能力を与えます fscanf およびその他の標準入出力機能。
  4. いつかあなたのコードを、ANSI C のみをサポートし、 open 関数。

私の意見では、行末の翻訳は役立つというよりも邪魔になることが多く、 fscanf あまりにも弱いので、より便利なものを選んで必然的にそれを放棄することになります。

C をサポートするほとんどのプラットフォームには、 open 関数。

バッファリングの問題は残ります。主にファイルを順次読み書きする場合、バッファリングのサポートは非​​常に役立ち、速度が大幅に向上します。しかし、ファイルにデータが存在すると予想したときにデータが存在しないという興味深い問題が発生する可能性があります。覚えておく必要があります fclose または fflush 適切なタイミングで。

シーク (別名) を行っている場合 fsetpos または fseek 2 番目の方法は、標準に準拠した方法で使用するのが少し難しくなります)、バッファリングの有用性はすぐに低下します。

もちろん、私の偏見は、ソケットを扱うことが多いということであり、実際にはノンブロッキング IO を実行したいという事実があります。 FILE * 合理的な方法でサポートすることはまったくできません)バッファリングがまったくなく、複雑な解析要件がしばしばあるため、私の認識は非常に変わります。

他のヒント

open() の低レベルのOSの呼び出しです。 fdopen() のCの高レベルのFILE-抽象にOSレベルのファイル記述子を変換します言語。 fopen() には、バックグラウンドでopen()を呼び出し、直接あなたにFILEポインタを与えます。

使用のより容易でなく、このような内蔵バッファリングなどの他の技術的利点を含む生ファイルディスクリプタむしろFILE-オブジェクトを使用するいくつかの利点があります。特にバッファリングは、一般的にかなりのパフォーマンス上の利点をもたらす。

Cで開い対のfopen

fopenのシステムコールするである

1)openはののライブラリ関数である。

2)fopenを提供する高速ののバッファリングされている。

openと比較されるIO ]を緩衝

3)fopenの携帯の一方openないの携帯するのオープンである環境特定する)。

4)fopenのファイル構造(ファイル*)へのポインタを返します。 openファイルを識別する整数を返します。

5)FILE *はあなたにfscanfはののやその他のstdio関数を使用する能力を提供します。

あなたはFILE *を持っている場合は、あなただけのファイル記述子を持っている場合は、

、あなたはfscanffprintffgetsなどのような関数を使用することができ、あなたが限られている(しかし、そう速い)入力および出力ルーチンreadwriteなど。

あなたがopenを使用すると、実際のパフォーマンス上の利点であるアプリケーションの0.1%の一部でない限り、

、本当にfopenを使用しない手はないでしょう。あなたはファイルディスクリプタで遊んでいない場合に限りfdopenが懸念しているとして、あなたはその呼び出しを必要としません。

fopenと(らfwritefreadfprintf、)メソッドのその家族と一緒に固執すると、あなたは非常に満足するでしょう。ただ、重要なこととして、他のプログラマは、コードに満足されます。

開い使用すると、書き込みはあなたが信号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が原因となったため、

私は、二重、私は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) システム コールであり、より高速で適切です。 フォーペン.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top