2016-09-21 1 views
3

たとえば、fscanf()を使用してファイルを読み取る場合、ファイルの先頭からやり直すのではなく、最後にどこが終了したかを覚えているようです。誰かがこの作品がどのくらい正確かを詳しく教えてもらえますか?私はこのコンポーネントを理解していないので、これらの関数を使用するのが難しいと思っています。fscanf()やfgets()などの関数は、ファイルのどこから読み込みを開始するかを覚えていますか?

+0

これは、 'FILE *'パラメータのためのものです。 – kaylum

+0

@kaylumあなたは詳細を教えていただけますか?私はこれについての良い概念的な理解を得たいと思います。私はFILE *の使用をよく知っていることを言及する必要がありますが、私はそれがこの機能を引き受けたことに気づいていませんでした。詳しく教えてください。 –

+0

最後に読み込まれた位置を格納します。これは 'fseek'で調整しているのと同じことです。 –

答えて

6

FILE *パラメータは、バッファとファイルハンドルを指します(fileno()機能参照)。

実際の場所は、ファイル構造のカーネルで記憶されています。

FILE *ポインターがファイルを指しているという凡例があります。これは文字通り真実ではありませんが、初心者プログラマの解釈にも当てはまります。

すべてのプロセスは、すべてのオープンファイルを含むstruct fileタイプのカーネル内の配列を持っています(このタイプはユーザー空間では定義されていないため、探していません)。ハンドルは、open()システムコールによって返されます。これは単に配列のインデックスにすぎません。関数fileno()は、fopen()によって返されたFILE *ポインタからハンドルを取得し、直接操作することができます。これは通常、FILEオブジェクトの内部バッファーとの戦いになるので、ioctl()またはfctl()にアクセスする以外は悪い考えです。

struct fileのメンバーの1つは、またはwrite()で停止した正確なバイト数であるloff_t f_posです。 FILEにバッファリングされています。これは、先読みしたバイト数または後で書き込むために保留したバイト数を知っています。

+0

ありがとう、Joshua。あなたは何が起こっているか正確に詳しく教えていただけますか?私はここで何が起こっているの良い概念的なアイデアが欲しいです。 –