C Programming
In this tutorial we will learn to randomly access file data in C programming language.
In this tutorial we will be discussing the fseek()
, ftell()
and rewind()
functions to access data in a file.
The ftell()
function tells us about the current position in the file (in bytes).
Syntax:
pos = ftell(fptr);
Where, fptr
is a file pointer. pos
holds the current position i.e., total bytes read (or written).
Example:
If a file has 10 bytes of data and if the ftell()
function returns 4 then, it means that 4 bytes has already been read (or written).
We use the rewind()
function to return back to the starting point in the file.
Syntax:
rewind(fptr);
Where, fptr
is a file pointer.
We use the fseek()
function to move the file position to a desired location.
Syntax:
fseek(fptr, offset, position);
Where, fptr
is the file pointer. offset
which is of type long
, specifies the number of positions (in bytes) to move in the file from the location specified by the position
.
The position
can take the following values.
Following are the list of operations we can perform using the fseek()
function.
Operation | Description |
---|---|
fseek(fptr, 0, 0) | This will take us to the beginning of the file. |
fseek(fptr, 0, 2) | This will take us to the end of the file. |
fseek(fptr, N, 0) | This will take us to (N + 1)th bytes in the file. |
fseek(fptr, N, 1) | This will take us N bytes forward from the current position in the file. |
fseek(fptr, -N, 1) | This will take us N bytes backward from the current position in the file. |
fseek(fptr, -N, 2) | This will take us N bytes backward from the end position in the file. |
#include <stdio.h>
int main(void) {
// integer variable
int i;
// character variable
char ch;
// file pointer
FILE *fptr;
// open file in write mode
fptr = fopen("char", "w");
if (fptr != NULL) {
printf("File created successfully!\n");
}
else {
printf("Failed to create the file.\n");
// exit status for OS that an error occured
return -1;
}
// write data in file
for (ch = 'A'; ch <= 'Z'; ch++) {
putc(ch, fptr);
}
// close connection
fclose(fptr);
// reference
printf("\nReference:\n");
for (i = 0; i < 26; i++) {
printf("%d ", (i+1));
}
printf("\n");
for (i = 65; i <= 90; i++) {
// print character
printf("%c", (i));
// manage space
if (i - 65 >= 9) {
printf(" ");
}
else {
printf(" ");
}
}
printf("\n\n");
// open file for reading
fptr = fopen("char", "r");
printf("Curr pos: %ld\n", ftell(fptr));
// read 1st char in the file
fseek(fptr, 0, 0);
ch = getc(fptr);
printf("1st char: %c\n", ch);
printf("Curr pos: %ld\n", ftell(fptr));
// read 5th char in the file
fseek(fptr, 4, 0);
ch = getc(fptr);
printf("5th char: %c\n", ch);
printf("Curr pos: %ld\n", ftell(fptr));
// read 26th char in the file
fseek(fptr, 25, 0);
ch = getc(fptr);
printf("26th char: %c\n", ch);
printf("Curr pos: %ld\n", ftell(fptr));
// rewind
printf("rewind\n");
rewind(fptr);
printf("Curr pos: %ld\n", ftell(fptr));
// read 10th char in the file
fseek(fptr, 9, 0);
ch = getc(fptr);
printf("10th char: %c\n", ch);
printf("Curr pos: %ld\n", ftell(fptr));
// read 15th char in the file
fseek(fptr, 4, 1); // move 4 bytes forward from current position
ch = getc(fptr);
printf("15th char: %c\n", ch);
printf("Curr pos: %ld\n", ftell(fptr));
// read 20th char in the file
fseek(fptr, 4, 1); // move 4 bytes forward from current position
ch = getc(fptr);
printf("20th char: %c\n", ch);
printf("Curr pos: %ld\n", ftell(fptr));
// close connection
fclose(fptr);
return 0;
}
Output:
File created successfully!
Reference:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Curr pos: 0
1st char: A
Curr pos: 1
5th char: E
Curr pos: 5
26th char: Z
Curr pos: 26
rewind
Curr pos: 0
10th char: J
Curr pos: 10
15th char: O
Curr pos: 15
20th char: T
Curr pos: 20
ADVERTISEMENT