2013-11-05 12 views

risposta

3

Sì, stai cercando lseek.

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

+1

Che cosa fa esattamente "dove" fare? Sono un po 'confuso dal suo uso delle parole "buchi" e "dati". I valori non sono zero e valori zero dei fori? – zaloo

+1

Il 'quale' governa ciò che l'offset è relativo a. Quindi se chiedi 10 byte con 'SEEK_SET', saranno 10 byte dall'inizio del file. Se richiedi 6 byte con 'SEEK_CUR', saranno 16 byte dall'inizio del file. – paddy

+0

Non preoccuparti delle lacune e dei buchi. Si tratta della situazione in cui cerchi oltre la fine di un file. – paddy

0

Sì, è possibile utilizzare lseek():

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

La funzione lseek() riposiziona l'offset del file aperto associato al descrittore di file fd all'argomento offse t secondo la direttiva whence come segue:

SEEK_SET

L'offset è impostato su offset byte.

SEEK_CUR

L'offset viene impostata alla posizione corrente più offset byte.

SEEK_END

L'offset viene impostata la dimensione del file più offset byte.

5

Sì. La funzione lseek si utilizza in the same library.

È quindi possibile cercare qualsiasi offset relativo all'inizio o alla fine del file o relativo alla posizione corrente.

Non essere sopraffatto da quella pagina della libreria. Ecco alcuni semplici esempi di utilizzo e probabilmente la maggior parte delle persone avrà mai bisogno di:

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 */ 

Buona fortuna!

8

Ci sono pread/pwrite funzioni che accettano file di offset:

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 per questa risposta. Per i programmi multi-thread, 'pread()' e 'pwrite()' sono migliori, perché non influenzano l'offset del file (quindi più thread possono leggere dallo stesso descrittore di file senza alcun blocco e senza condizioni di competizione tra 'lseek() 'e' read() '). –

+1

Anche solo 1 chiamata di sistema! –