This should do, if you're using linux:
#include <fcntl.h> /* open() */
#include <unistd.h> /* close(), read(), lseek */
#include <stdio.h>
#define FILE_PATH "/path/to/the/file/to/print"
static void goToPositionInFile(int fileDescriptor, int position)
{
lseek(fileDescriptor, position, SEEK_SET);
}
static void goToEndOfFile(int fileDescriptor)
{
lseek(fileDescriptor, -1, SEEK_END);
}
static int positionInFile(int fileDescriptor)
{
return lseek(fileDescriptor, 0, SEEK_CUR);
}
static void printFileBackwards(int fileDescriptor)
{
char character;
int position;
goToEndOfFile(fileDescriptor);
do
{
position = positionInFile(fileDescriptor);
read(fileDescriptor, & character, 1);
write(1, & character, 1); /* first argument: target file (stdout) */
goToPositionInFile(fileDescriptor, position - 1);
} while (position > 0);
}
static void openAndPrintFileBackwards(char const * const filePath)
{
int fileDescriptor = open(filePath, 0);
printFileBackwards(fileDescriptor);
close(fileDescriptor);
}
int main(void)
{
openAndPrintFileBackwards(FILE_PATH);
return 0;
}
gcc -ansi -Wall -Wextra -Werror foo.c -o foo
./foo
If you want to buffer the file, you'll need an array, to get the required size:
#include <sys/stat.h>
static long fileSizeInBytes(int fileDescriptor)
{
struct stat fileStats;
fstat(fileDescriptor, & fileStats);
return fileStats.st_size;
}
Manuals, if something doesn't work on your system:
man 2 open
man 2 close
man 2 read
man 2 write
man fstat