next up previous
Next: dup/dup2 Up: Operatii de intrare/iesire (I/O) Previous: read/write

lseek

Operatia lseek repozitioneaza cursorul de fisier, astfel incat o operatie read/write va lucra incepand cu aceasta noua pozitie. Sintaxa de apel este

#include <sys/types.h>
#include <unistd.h>

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

fildes este descriptorul de fisier pentru care vom repozitiona cursorul;

offset este offset-ul repozitionarii (poate fi pozitiv sau negativ);

whence este o directiva care specifica de unde se incepe repozitionarea; poate avea valorile:

Valoarea intoarsa reprezinta pozitia (offset-ul) cursorului relativ la inceputul fisierului in caz de succes, sau -1 in caz de eroare.

Exemplu de utilizare:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

...
        int fd;
        char buf[5];

        /*
         * deschidem fisierul in modul APPEND (cursorul e la sfarsitul
         * fisierului)
         */
        fd = open ("myfile.txt", O_RDWR | O_APPEND);
        if (fd < 0) {
                perror ("open");
                exit (EXIT_FAILURE);
        }

        /* ne pozitionam inaintea ultimilor 4 octeti din fisier */
        if (lseek (fd, -4, SEEK_CUR) < 0) {
                perror ("open");
                exit (EXIT_FAILURE);
        }

        /* citim ultimii 4 octeti din fisier */
        if (read (fd, buf, 4) < 0) {
                perror ("read");
                exit (EXIT_FAILURE);
        }
...

O bucata de cod cu aceeasi functionalitate ca cea de mai sus este prezentata in continuare:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

...
        int fd;

        /*
         * fisierul este deschis pentru citire/scriere; cursorul este
         * pozitionat la inceputul fisierului
         */
        fd = open ("myfile.txt", O_RDWR);
        if (fd < 0) {
                perror ("open");
                exit (EXIT_FAILURE);
        }

        /* ne pozitionam inainte ultimilor 4 octeti din fisier */
        if (lseek (fd, -4, SEEK_END) < 0) {
                perror ("lseek");

                exit (EXIT_FAILURE);

        }

        /* citim ultimii octeti din fisier */
        if (read (fd, buf, 4) < 0) {
                perror ("read");
                exit (EXIT_FAILURE);
        }
...



Razvan Adrian Deaconescu 2005-10-01