2013-11-05 148 views

回答

3

是的,您正在尋找lseek

http://linux.die.net/man/2/lseek

+1

到底是什麼 「何處」 嗎?我對使用「孔」和「數據」這個詞有些困惑。數據非零值和孔零值? – zaloo

+1

'whence'控制偏移量相對於什麼。所以,如果你用'SEEK_SET'請求10個字節,它將從文件開頭起10個字節。如果你用'SEEK_CUR'請求6個字節,則它將從文件開頭起16個字節。 – paddy

+0

不要擔心間隙和孔洞。這是處理你尋求超過文件結尾的情況。 – paddy

0

是的,你可以使用lseek()

off_t lseek(int fd, off_t offset, int whence); 

lseek()功能重新定位,根據該指令與文件描述符fd相關的說法offse噸打開文件的偏移whence如下:

SEEK_SET

偏移量設置爲偏移字節。

SEEK_CUR

被設置爲它的當前位置加上偏移字節偏移量。

SEEK_END

被設置爲文件的大小加上偏移字節偏移量。

5

是的。您使用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 */ 

祝你好運!

8

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); 
+4

對此答案+1。對於多線程程序,'pread()'和'pwrite()'更好,因爲它們不會影響文件偏移量(所以多個線程可以從同一個文件描述符中讀取,而不需要任何鎖定,也不會在'lseek ()'和'read()')。 –

+1

也只有1個系統調用! –