Okay, here's a real example of using lseek() to jump around. Look over the code, and see if you can tell what it's going to do, then compile and run it.
* CH4RANDOM: Example of random access to an IFS object
* (From Chap 3)
*
* To compile:
* CRTBNDRPG CH3RANDOM SRCFILE(xxx/QRPGLESRC) DBGVIEW(*LIST)
*
H DFTACTGRP(*NO) ACTGRP(*NEW) BNDDIR('QC2LE')
D/copy IFSEBOOK/QRPGLESRC,IFSIO_H
D/copy IFSEBOOK/QRPGLESRC,ERRNO_H
D fd S 10I 0
D err S 10I 0
D wrdata S 48A
D rddata S 22A
D ShowMe S 48A varying
c eval fd = open('/ifstest/ch2_test.dat':
c O_WRONLY+O_CREAT+O_TRUNC:
c S_IRUSR+S_IWUSR+S_IRGRP)
c if fd < 0
c callp die('open(): ' + %str(strerror(errno)))
c endif
C* Write some data
c eval wrdata = 'THE QUICK BROWN FOX JUMP' +
c 'ED OVER THE LAZY GIRAFFE'
c if write(fd: %addr(wrdata): %size(wrdata))<1
c eval err = errno
c callp close(fd)
c callp die('write(): ' + %str(strerror(errno)))
c endif
c callp close(fd)
c eval fd = open('/ifstest/ch2_test.dat':
c O_RDONLY)
c if fd < 0
c callp die('open(): ' + %str(strerror(errno)))
c endif
c eval %len(ShowMe) = 0
C* Read the first 16 bytes
c callp read(fd: %addr(rddata): 16)
c eval ShowMe = ShowMe + %subst(rddata:1:16)
C* Jump to byte 41 of the file
C* and read 7 bytes
c if lseek(fd: 41: SEEK_SET) < 0
c callp die('lseek(): ' + %str(strerror(errno)))
c endif
c callp read(fd: %addr(rddata): 7)
c eval ShowMe = ShowMe + %subst(rddata:1:7)
C* Jump to byte 19 of the file
C* and read 22 bytes
c if lseek(fd: 19: SEEK_SET) < 0
c callp die('lseek(): ' + %str(strerror(errno)))
c endif
c callp read(fd: %addr(rddata): 22)
c eval ShowMe = ShowMe + %subst(rddata:1:22)
C* Jump to byte 16 of the file
C* and read 3 bytes
c if lseek(fd: 16: SEEK_SET) < 0
c callp die('lseek(): ' + %str(strerror(errno)))
c endif
c callp read(fd: %addr(rddata): 3)
c eval ShowMe = ShowMe + %subst(rddata:1:3)
c callp close(fd)
C* Show what we read
c dsply ShowMe
c eval *inlr = *on
/DEFINE ERRNO_LOAD_PROCEDURE
/COPY IFSEBOOK/QRPGLESRC,ERRNO_H