C rewind function
last modified April 6, 2025
File handling in C requires precise control over file positions for efficient
data access. The rewind function resets the file position indicator
to the beginning of the file. This tutorial explains rewind in
detail with practical examples. You'll learn when and how to use it effectively
in your file operations. Mastering rewind helps in scenarios where
you need to re-read or overwrite file contents.
What Is rewind?
The rewind function in C resets the file position indicator to the
start of the file. It takes a single parameter: a pointer to a FILE
object. Unlike fseek, it doesn't return a value and clears any
error indicators. It's equivalent to fseek(fp, 0L, SEEK_SET) but
simpler to use. Always ensure the file is opened successfully before calling
rewind.
Basic rewind Example
This example demonstrates the simplest use of rewind to read a file
twice.
#include <stdio.h>
int main() {
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// First read
printf("First read:\n");
char ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
rewind(fp); // Reset to beginning
// Second read
printf("\n\nSecond read:\n");
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
fclose(fp);
return 0;
}
This program opens a file and reads its contents twice. After the first read,
rewind resets the position to start. Without rewind,
the second read would fail as the pointer would be at EOF. The file is properly
closed after both reads complete.
Rewind After Writing
Use rewind to read back data you just wrote to a file.
#include <stdio.h>
int main() {
FILE *fp = fopen("temp.txt", "w+");
if (fp == NULL) {
perror("Error creating file");
return 1;
}
fprintf(fp, "Sample text\n"); // Write to file
rewind(fp); // Go back to start
char buffer[50];
fgets(buffer, sizeof(buffer), fp); // Read what we wrote
printf("File content: %s", buffer);
fclose(fp);
remove("temp.txt"); // Clean up
return 0;
}
This example uses "w+" mode to both write and read the file. After writing,
rewind allows reading from the start. The temporary file is deleted
after use. This pattern is useful for temporary data processing.
Rewind with Binary Files
rewind works equally well with binary files, as shown here.
#include <stdio.h>
int main() {
FILE *fp = fopen("data.bin", "wb+");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
int nums[] = {1, 2, 3, 4, 5};
fwrite(nums, sizeof(int), 5, fp); // Write array
rewind(fp); // Back to start
int read_nums[5];
fread(read_nums, sizeof(int), 5, fp); // Read array
for (int i = 0; i < 5; i++) {
printf("%d ", read_nums[i]);
}
fclose(fp);
return 0;
}
This program writes an integer array to a binary file, then uses
rewind to read it back. Binary mode ("wb+") ensures exact data
representation. The array is successfully read and printed after rewinding.
Rewind in Update Mode
Combine rewind with update mode for flexible file access.
#include <stdio.h>
int main() {
FILE *fp = fopen("data.txt", "r+");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// Read first line
char line[100];
fgets(line, sizeof(line), fp);
printf("First line: %s", line);
rewind(fp); // Back to start
// Overwrite first line
fprintf(fp, "New first line\n");
rewind(fp); // Read again
fgets(line, sizeof(line), fp);
printf("Updated first line: %s", line);
fclose(fp);
return 0;
}
"r+" mode allows both reading and writing. After reading the first line,
rewind positions us to overwrite it. Another rewind
lets us verify the change. This demonstrates in-place file modification.
Rewind vs fseek
Compare rewind with fseek for positioning.
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// Using fseek to go to start
fseek(fp, 0L, SEEK_SET);
printf("Position after fseek: %ld\n", ftell(fp));
// Using rewind
rewind(fp);
printf("Position after rewind: %ld\n", ftell(fp));
fclose(fp);
return 0;
}
Both fseek and rewind move to the file start, but
rewind is simpler. fseek returns a status while
rewind doesn't. rewind also clears error flags.
ftell confirms the position after each operation.
Error Handling with rewind
Proper error handling ensures safe rewind usage.
#include <stdio.h>
int main() {
FILE *fp = fopen("nonexistent.txt", "r");
if (fp == NULL) {
perror("Initial open failed");
return 1;
}
// Simulate error
if (fseek(fp, 1000L, SEEK_SET) != 0) {
perror("fseek failed");
}
rewind(fp); // Clears error and resets position
printf("Rewind successful\n");
char ch = fgetc(fp); // Now works
printf("First char: %c\n", ch);
fclose(fp);
return 0;
}
This example shows rewind recovering from an error condition.
After a failed fseek, rewind resets both position and
error state. Subsequent operations then work normally. Always check file
operations for errors.
Rewind in Large File Processing
Process large files in chunks using rewind.
#include <stdio.h>
#define CHUNK_SIZE 1024
int main() {
FILE *fp = fopen("large.bin", "rb");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
unsigned char buffer[CHUNK_SIZE];
size_t bytes_read;
int chunks = 0;
while ((bytes_read = fread(buffer, 1, CHUNK_SIZE, fp))) {
chunks++;
// Process chunk here
if (chunks % 100 == 0) {
printf("Processed %d chunks\n", chunks);
rewind(fp); // Restart processing (demo only)
break;
}
}
fclose(fp);
return 0;
}
This demonstrates processing a file in chunks. While normally you wouldn't
rewind in a real processing loop, it shows how to restart reading.
For actual large files, consider memory mapping or more sophisticated approaches.
Best Practices for Using rewind
- Check File Open: Always verify the file opened successfully before rewinding.
- Understand Mode: Ensure the file is opened in a mode that supports seeking.
- Clear Errors: Remember rewind clears error indicators, which can mask issues.
- Combine with Flush: For write operations, consider fflush before rewind.
- Alternative to fseek: Use rewind when simply returning to start is needed.
Source
This tutorial has demonstrated the versatility of rewind in C file
handling. From basic file rereading to error recovery, rewind
simplifies position management. Proper use of this function makes file processing
more robust and efficient.
Author
List C Standard Library.