DosSetFilePtr
Appearance
Moves the read/write pointer according to the type of move specified.
Syntax
DosSetFilePtr (hFile, ib, method, ibActual)
Parameters
- hFile (HFILE) - input
- The handle returned by a previous DosOpen function.
- ib (LONG) - input
- The signed distance (offset) to move, in bytes.
- method (ULONG) - input
- The method of moving.
- Specifies a location in the file from where the ib to move the read/write pointer starts. The values and their meanings are described in the following list:
- 0 FILE_BEGIN Move the pointer from the beginning of the file.
- 1 FILE_CURRENT Move the pointer from the current location of the read/write pointer.
- 2 FILE_END Move the pointer from the end of the file. Use this method to determine a file's size.
- ibActual (PULONG) - output
- Address of the new pointer location.
Return Code
ulrc (APIRET) - returns
DosSetFilePtr returns one of the following values:
- 0 NO_ERROR
- 1 ERROR_INVALID_FUNCTION
- 6 ERROR_INVALID_HANDLE
- 132 ERROR_SEEK_ON_DEVICE
- 131 ERROR_NEGATIVE_SEEK
- 130 ERROR_DIRECT_ACCESS_HANDLE
Remarks
The read/write pointer in a file is a signed 32-bit number. A negative value for ib moves the pointer backward in the file; a positive value moves it forward. DosSetFilePtr cannot be used to move to a negative position in the file.
DosSetFilePtr cannot be used for a character device or pipe.
Example Code
This example opens or creates and opens a file named "DOSTEST.DAT", writes to it, positions the file pointer back to the beginning of the file, reads from the file, and finally closes it.
#define INCL_DOSFILEMGR /* File Manager values */
#define INCL_DOSERRORS /* DOS Error values */
#include <os2.h>
#include <stdio.h>
#include <string.h>
int main(void) {
HFILE hfFileHandle = 0L; /* Handle for file being manipulated */
ULONG ulAction = 0; /* Action taken by DosOpen */
ULONG ulBytesRead = 0; /* Number of bytes read by DosRead */
ULONG ulWrote = 0; /* Number of bytes written by DosWrite */
ULONG ulLocal = 0; /* File pointer position after DosSetFilePtr */
UCHAR uchFileName[20] = "dostest.dat", /* Name of file */
uchFileData[100] = " "; /* Data to write to file */
APIRET rc = NO_ERROR; /* Return code */
/* Open the file test.dat. Use an existing file or create a new */
/* one if it doesn't exist. */
rc = DosOpen(uchFileName, /* File path name */
&hfFileHandle, /* File handle */
&ulAction, /* Action taken */
100L, /* File primary allocation */
FILE_ARCHIVED | FILE_NORMAL, /* File attribute */
OPEN_ACTION_CREATE_IF_NEW |
OPEN_ACTION_OPEN_IF_EXISTS, /* Open function type */
OPEN_FLAGS_NOINHERIT |
OPEN_SHARE_DENYNONE |
OPEN_ACCESS_READWRITE, /* Open mode of the file */
0L); /* No extended attribute */
if (rc != NO_ERROR) {
printf("DosOpen error: return code = %u\n", rc);
return 1;
} else {
printf ("DosOpen: Action taken = %ld\n", ulAction);
} /* endif */
/* Write a string to the file */
strcpy (uchFileData, "testing...\n1...\n2...\n3\n");
rc = DosWrite (hfFileHandle, /* File handle */
(PVOID) uchFileData, /* String to be written */
sizeof (uchFileData), /* Size of string to be written */
&ulWrote); /* Bytes actually written */
if (rc != NO_ERROR) {
printf("DosWrite error: return code = %u\n", rc);
return 1;
} else {
printf ("DosWrite: Bytes written = %u\n", ulWrote);
} /* endif */
/* Move the file pointer back to the beginning of the file */
rc = DosSetFilePtr (hfFileHandle, /* File Handle */
0L, /* Offset */
FILE_BEGIN, /* Move from BOF */
&ulLocal); /* New location address */
if (rc != NO_ERROR) {
printf("DosSetFilePtr error: return code = %u\n", rc);
return 1;
}
/* Read the first 100 bytes of the file */
rc = DosRead (hfFileHandle, /* File Handle */
uchFileData, /* String to be read */
100L, /* Length of string to be read */
&ulBytesRead); /* Bytes actually read */
if (rc != NO_ERROR) {
printf("DosRead error: return code = %u\n", rc);
return 1;
} else {
printf ("DosRead: Bytes read = %u\n%s\n", ulBytesRead, uchFileData);
} /* endif */
rc = DosClose(hfFileHandle); /* Close the file */
if (rc != NO_ERROR) {
printf("DosClose error: return code = %u\n", rc);
return 1;
}
return NO_ERROR;
}