0

グローバル FILEポインター/ディスクリプターが必要です。関数の 1 つは、このポインター/記述子から読み取ります。ポインター/記述子に関連付けられた内部ポインターFILEが進みます。この関数が戻った後、同じポインター/記述子から読み取り、他の関数が読み取ったのと同じデータを読み取りたいと考えています。FILE

しかし、内部ポインターが進んでいるため、まったく同じデータを読み取ることはできません。複製はオリジナルを反映するため、記述子の複製は機能しません。読み取り前にポインターを保存してFILEも、それはポインターであるため機能せず、再び同じものを参照し始めます。

1 つの代替方法は、読み取り前に使用してファイル位置を保存し、次の読み取りの前にfgetpos()使用することです。fsetpos()

ただし、これは記述子ではなくファイルポインターに対して機能します。

通常のポインターを使用すると、とても簡単です。FILEしかし、ポインターを使用すると事態が難しくなります。

これを達成するための他の不器用な方法はありますか?

4

3 に答える 3

1

POSIX ファイル記述子を参照している場合は、lseek().

off_t off;

off = lseek(fd, 0, SEEK_CUR); /* get current offset */
/* do some read(s) */
lseek(fd, off, SEEK_SET);
于 2012-05-22T13:40:03.917 に答える
0

あなたの説明に基づいて、最後に読み取ったデータのチャンクをバッファリングする別のインターフェイスの背後にそのファイル ポインタを隠して、コードのさまざまな領域がストリームを巻き戻すことなく同じデータにアクセスできるようにします。

于 2012-05-22T14:50:13.027 に答える
0

別のオプションは、を使用してファイルをメモリマップすることですmmap()

lseek()これにより、またはを使用せずに、ファイル内の任意の位置をランダムに読み取ることができますfseek()

linuxquestionsmmap()で短いチュートリアルを見つけることができます

于 2012-05-22T13:46:21.757 に答える