私は、ファイルディスクリプタを指定してファイルを読み書きするのに、read(2)とwrite(2)関数を使用していました。オフセットでのファイル記述子からの読み書き
読み書きのためにオフセットをファイルに入れることができるような関数はありますか?
私は、ファイルディスクリプタを指定してファイルを読み書きするのに、read(2)とwrite(2)関数を使用していました。オフセットでのファイル記述子からの読み書き
読み書きのためにオフセットをファイルに入れることができるような関数はありますか?
はい、あなたはlseek
を探しています。
はい、あなたは使用することができlseek()
:lseek()
機能が指示に従って引数offse
トンにファイルディスクリプタfd
に関連付けられたオープンされたファイルのオフセットを再配置し
off_t lseek(int fd, off_t offset, int whence);
whence
は、次のとおりです。
SEEK_SET
オフセットはオフセットバイトに設定されます。
SEEK_CUR
オフセット現在の場所に設定プラスバイトオフセットされています。
SEEK_END
オフセットファイルのサイズに設定プラスバイトオフセットされます。
はい。 the same libraryにlseek
関数を使用します。
ファイルの開始位置または終了位置、または現在の位置からの相対的なオフセットを求めることができます。
そのライブラリページに圧倒されないでください。ここに簡単な使用例がいくつかあります。おそらくすべての人々が必要とするでしょう:
lseek(fd, 0, SEEK_SET); /* seek to start of file */
lseek(fd, 100, SEEK_SET); /* seek to offset 100 from the start */
lseek(fd, 0, SEEK_END); /* seek to end of file (i.e. immediately after the last byte) */
lseek(fd, -1, SEEK_END); /* seek to the last byte of the file */
lseek(fd, -10, SEEK_CUR); /* seek 10 bytes back from your current position in the file */
lseek(fd, 10, SEEK_CUR); /* seek 10 bytes ahead of your current position in the file */
幸運!
ファイルオフセット受け入れるpread/pwrite機能があります。
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
+1です。マルチスレッドプログラムの場合、 'pread()'と 'pwrite()'はファイルのオフセットに影響を与えないので、より優れています(複数のスレッドは同じファイル記述子からロックをせず、 'lseek () 'と' read() ')を呼び出します。 –
また、システムコールは1つだけです! –
「そこ」は、正確に何をしますか?私は、「穴」と「データ」という言葉を使うことでちょっと混乱しています。データはゼロ以外の値であり、ホールはゼロの値ですか? – zaloo
'whence'はオフセットがどのようなものかを決定します。したがって、SEEK_SETで10バイトを要求すると、ファイルの先頭から10バイトになります。 'SEEK_CUR'で6バイトを要求すると、ファイルの先頭から16バイトになります。 – paddy
ギャップと穴が気になることはありません。これは、ファイルの最後を追うような状況に対処しています。 – paddy