C Programming File Positioning And Error Handling Fseek Ftell Feof Ferror Complete Guide

 Last Update:2025-06-22T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    10 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of C Programming File Positioning and Error Handling fseek, ftell, feof, ferror

File Positioning in C Programming

In C, file positioning is crucial for managing file operations effectively. The primary functions used for file positioning are fseek, ftell, and rewind. These functions allow you to control the position of the file pointer within a file.

fseek()

The fseek() function sets the file position indicator for the stream pointed to by stream. It is declared in the stdio.h header file.

Syntax:

int fseek(FILE *stream, long int offset, int whence);
  • stream: FILE pointer to the file.
  • offset: Number of bytes to offset from whence.
  • whence: Specifies the reference point for offset and must be one of the following values:
    • SEEK_SET: Begining of file.
    • SEEK_CUR: Current position of the file pointer.
    • SEEK_END: End of file.

Return Value:

  • 0 on success.
  • Non-zero on failure.

Example:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "r");
    
    if (fp == NULL) {
        perror("Error opening file");
        return(-1);
    }

    fseek(fp, 5L, SEEK_SET); // Move 5 bytes from the beginning of the file.
    printf("File pointer is at byte %ld\n", ftell(fp));
    
    fclose(fp);
    return (0);
}

ftell()

The ftell() function obtains the current value of the file position indicator for the stream pointed to by stream. This function is useful for knowing the position of the file pointer at any given time.

Syntax:

long int ftell(FILE *stream);

Return Value:

  • On success, it returns the current file position indicator as a long value.
  • On failure, it returns -1L.

Example:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "r");
    
    if (fp == NULL) {
        perror("Error opening file");
        return(-1);
    }

    printf("File pointer is at byte %ld\n", ftell(fp)); // Should print 0 here.
    fgetc(fp);
    printf("After reading a character, file pointer is at byte %ld\n", ftell(fp));

    fclose(fp);
    return (0);
}

rewind()

The rewind() function sets the file position indicator for the stream pointed to by stream to the beginning of the file.

Syntax:

void rewind(FILE *stream);

Example:

#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "r");
    
    if (fp == NULL) {
        perror("Error opening file");
        return(-1);
    }

    printf("File pointer is at byte %ld\n", ftell(fp)); // Should print 0 here.
    fgetc(fp);
    printf("After reading a character, file pointer is at byte %ld\n", ftell(fp));
    rewind(fp);
    printf("After rewind, file pointer is at byte %ld\n", ftell(fp));

    fclose(fp);
    return (0);
}

Error Handling in C File Operations

Error handling in file operations is essential for writing robust and user-friendly programs. The functions feof() and ferror() are commonly used for this purpose.

feof()

The feof() function tests the end-of-file indicator for the given stream. After an EOF occurs, the end-of-file indicator remains set for the stream until it is cleared.

Syntax:

int feof(FILE *stream);

Return Value:

  • Non-zero if the end-of-file indicator is set for stream.
  • Zero if the end-of-file indicator is not set.

Example:

#include <stdio.h>

int main() {
    FILE *fp;
    char ch;
    fp = fopen("example.txt", "r");
    
    if (fp == NULL) {
        perror("Error opening file");
        return(-1);
    }
    
    while((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    if (feof(fp)) {
        printf("End of file reached.\n");
    } else {
        printf("Error reading file.\n");
    }
    
    fclose(fp);
    return (0);
}

ferror()

The ferror() function tests the error indicator for the given stream. After an error occurs, the error indicator remains set for the stream until it is cleared.

Syntax:

int ferror(FILE *stream);

Return Value:

  • Non-zero if the error indicator is set for stream.
  • Zero if the error indicator is not set.

Example:

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement C Programming File Positioning and Error Handling fseek, ftell, feof, ferror

Objective:

To learn how to control the position of a file pointer within a file and handle errors that may occur during file operations.

Functions Covered:

  1. fseek: Moves the file position indicator of the stream stream to a new position specified by offset relative to whence.
  2. ftell: Returns the current value of the position indicator of the stream stream.
  3. feof: Checks whether the end-of-file indicator associated with stream is set, returning a non-zero value if it is.
  4. ferror: Checks whether the error indicator associated with stream is set, returning a non-zero value if it is.

Example 1: Using fseek and ftell

Description:

  • Open a file named example.txt.
  • Write some text to the file.
  • Move to different positions in the file using fseek.
  • Display the current file pointer position using ftell.

Step-by-Step Guide:

  1. Include necessary header files.
  2. Open the file.
  3. Write data to the file.
  4. Use fseek to move the file pointer.
  5. Use ftell to get the current file pointer position.
  6. Close the file.
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *filename = "example.txt";
    FILE *fp;

    // Open file for writing
    fp = fopen(filename, "w");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // Write some data to the file
    fprintf(fp, "Hello, this is a test file.\nThis is the second line.\nAnd this is the third line.\n");

    // Close the file after writing
    fclose(fp);

    // Reopen the file for reading
    fp = fopen(filename, "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // Move the file pointer to the 17th byte (after "Hello, this is ")
    if (fseek(fp, 17L, SEEK_SET) != 0) {
        perror("Failed to seek file");
        fclose(fp);
        return EXIT_FAILURE;
    }

    // Read and print the next character from this position
    printf("Character at byte 17: '%c'\n", fgetc(fp));

    // Get the current position of the file pointer
    long position = ftell(fp);
    printf("Current file pointer position: %ld\n", position);

    // Move the file pointer back to the beginning
    rewind(fp); // Equivalent to fseek(fp, 0, SEEK_SET)
    printf("After rewind, file pointer position: %ld\n", ftell(fp));

    // Close the file after reading
    fclose(fp);

    return EXIT_SUCCESS;
}

Example 2: Using feof

Description:

  • Open a file named example.txt.
  • Read the contents of the file line by line.
  • Detect the end of the file using feof.

Step-by-Step Guide:

  1. Include necessary header files.
  2. Open the file.
  3. Read the file line by line until the end.
  4. Check if feof is set after reading.
  5. Close the file.
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *filename = "example.txt";
    FILE *fp;
    char buffer[100];

    // Open file for reading
    fp = fopen(filename, "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    while (!feof(fp)) {
        if (fgets(buffer, sizeof(buffer), fp) != NULL) {
            printf("%s", buffer);
        } else {
            // Check if feof is set or if an error occurred
            if (feof(fp)) {
                printf("End of file reached.\n");
            } else if (ferror(fp)) {
                perror("Error reading file");
                fclose(fp);
                return EXIT_FAILURE;
            }
        }
    }

    // Close the file after reading
    fclose(fp);

    return EXIT_SUCCESS;
}

Example 3: Using ferror

Description:

  • Attempt to read from a non-accessible file.
  • Handle the error using ferror.

Step-by-Step Guide:

  1. Include necessary header files.
  2. Attempt to open a file with incorrect permissions.
  3. Try to read from the inaccessible file.
  4. Check if ferror is set and handle the error.
  5. Close the file (if opened).
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *filename = "nonexistentfile.txt";
    FILE *fp;
    char buffer[100];

    // Open file for reading
    fp = fopen(filename, "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // Try to read data from the file (which does not exist)
    if (fgets(buffer, sizeof(buffer), fp) == NULL) {
        if (ferror(fp)) {
            perror("Error reading file");
            fclose(fp);
            return EXIT_FAILURE;
        }
    }

    // Display the read content (this would not execute if an error occurred)
    printf("Read from file: %s", buffer);

    // Close the file after finishing operations
    fclose(fp);

    return EXIT_SUCCESS;
}

Example 4: Combining fseek, ftell, feof, and ferror

Description:

  • Open a file named example.txt.
  • Write data to the file.
  • Read the file until its end, checking for errors and EOF.
  • Reset the file pointer using fseek.

Step-by-Step Guide:

  1. Include necessary header files.
  2. Open the file for writing.
  3. Write data to the file.
  4. Close the file.
  5. Reopen the file for reading.
  6. Read data from the file.
  7. Use feof, ferror, fseek, and ftell appropriately to handle different scenarios.
  8. Close the file after reading.
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *filename = "example.txt";
    FILE *fp;
    char buffer[100];
    int ch;

    // Open file for writing
    fp = fopen(filename, "w+");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // Write some data to the file
    fprintf(fp, "Line 1\nLine 2\nLine 3\n");

    // Reset the file pointer to the beginning
    rewind(fp);

    // Read data from the file
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    // Check if feof is set
    if (feof(fp)) {
        printf("\nEnd of file reached.\n");
        clearerr(fp); // Clear EOF flag
    }

    // Get the current file pointer position (should be at the end of the file)
    printf("Current file pointer position after reading: %ld\n", ftell(fp));

    // Reset file pointer
    fseek(fp, 0L, SEEK_SET);
    printf("After resetting, file pointer position: %ld\n", ftell(fp));

    // Read data again
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }
    printf("\n");

    // Check if ferror is set
    if (ferror(fp)) {
        perror("Error during file operation");
        fclose(fp);
        return EXIT_FAILURE;
    }

    // Close the file after operations
    fclose(fp);

    return EXIT_SUCCESS;
}

Explanation of Each Function:

  1. fseek(FILE *stream, long offset, int whence):

    • stream: The file stream.
    • offset: The number of bytes to offset.
    • whence: The starting point for the offset (e.g., SEEK_SET, SEEK_CUR, SEEK_END).
  2. long ftell(FILE *stream):

    • stream: The file stream.
    • Returns the current value of the position indicator of stream, or -1 on failure.
  3. int feof(FILE *stream):

    • stream: The file stream.
    • Returns a non-zero value if the end-of-file indicator is set; otherwise, returns 0.
  4. int ferror(FILE *stream):

    • stream: The file stream.
    • Returns a non-zero value if the error indicator is set; otherwise, returns 0.

Notes:

  • Always check the return value of file operations to ensure they succeed.
  • Use clearerr(FILE *stream) to reset the stream's error indicators.
  • Remember to close all opened files using fclose(FILE *stream) to free associated resources.

Top 10 Interview Questions & Answers on C Programming File Positioning and Error Handling fseek, ftell, feof, ferror

Top 10 Questions and Answers on C Programming: File Positioning and Error Handling (fseek, ftell, feof, ferror)

Q1: What is fseek in C, and how is it used?

int fseek(FILE *stream, long int offset, int whence);
  • stream: The file pointer.
  • offset: Number of bytes to move from the whence position.
  • whence: Position from which the offset is added (can be SEEK_SET, SEEK_CUR, or SEEK_END).

Example:

fseek(fp, 10, SEEK_SET);  // Moves 10 bytes from the beginning of the file.
fseek(fp, -20, SEEK_END); // Moves 20 bytes backwards from the end of the file.

Q2: How does ftell differ from fseek?

A2: ftell returns the current position of the file pointer in a file stream as a long int. This is useful for getting the current file position without changing it.

Syntax:

long int ftell(FILE *stream);

Example:

long int currentPos = ftell(fp);  // Gets the current position of the file pointer.
printf("Current position: %ld\n", currentPos);

Difference:

  • fseek sets the position of the file pointer.
  • ftell tells the current position of the file pointer.

Q3: What does the feof function check, and how is it typically used?

A3: feof is a function that checks if the end-of-file indicator has been set for a file stream. It returns a non-zero value if the end-of-file indicator has been set; otherwise, it returns zero. feof is frequently used in loops to determine when the end of a file has been reached.

Syntax:

int feof(FILE *stream);

Example:

while (c != EOF && !feof(fp)) {
    c = fgetc(fp);
    printf("%c", c);
}

Note: feof should be checked after a read operation fails to indicate that the end of the file has been reached.

Q4: What is the purpose of ferror?

A4: ferror checks if an error has occurred on a file stream. It returns a non-zero value if an error has occurred; otherwise, it returns zero.

Syntax:

int ferror(FILE *stream);

Example:

if (ferror(fp)) {
    perror("Error reading file");
    fclose(fp);
    exit(EXIT_FAILURE);
}

Q5: Can fseek and ftell be used interchangeably?

A5: No, fseek and ftell serve different purposes and cannot be used interchangeably:

  • fseek is used to modify (or set) the file pointer position.
  • ftell is used to report the current position of the file pointer.

Q6: Why is ftell often used in conjunction with fseek?

A6: ftell is often used before fseek to save the current file position. This allows for a return to the original position after performing some operations elsewhere in the file.

Example:

long int originalPos = ftell(fp);  // Store the current position.
fseek(fp, 20, SEEK_SET);         // Move to a new location in the file.
// Perform some operations.
fseek(fp, originalPos, SEEK_SET);  // Return to the original position.

Q7: What happens if fseek is called with a negative offset and whence set to SEEK_SET?

A7: If fseek is called with a negative offset and whence set to SEEK_SET, it is invalid because SEEK_SET positions the file pointer relative to the start of the file, which cannot be negative. This will set the file pointer to an indeterminate position, likely resulting in errors during reading or writing.

Example:

fseek(fp, -10, SEEK_SET);  // Invalid, will likely set the file pointer incorrectly.

Q8: Why is feof not usually used to terminate a reading loop?

A8: feof is not typically used to terminate a loop because it only returns a non-zero value after an attempted read past the end-of-file. This means the loop will execute one more iteration than expected, often leading to incorrect behavior or undefined behavior.

Incorrect Example:

while (!feof(fp)) {
    c = fgetc(fp);
    printf("%c", c);  // This will print an extra character (EOF).
}

Correct Example:

while ((c = fgetc(fp)) != EOF) {
    printf("%c", c);  // Correctly terminates before reaching EOF.
}

Q9: What are common error types that ferror can detect?

A9: ferror can detect several types of errors on file streams, including:

  • Disk full errors.
  • Invalid file operations (e.g., reading from a write-only file).
  • I/O errors during read/write operations.
  • Hardware failures.
  • File locking issues.

Q10: How can you clear error indicators on a file stream?

A10: Error indicators on a file stream can be cleared using the clearerr function. This function resets the end-of-file and error indicators for the stream.

Syntax:

void clearerr(FILE *stream);

Example:

You May Like This Related .NET Topic

Login to post a comment.