การเข้าถึงไฟล์แบบสุ่ม (Random Access) ในภาษา C ทำได้ด้วยฟังก์ชัน 3 ตัวหลัก:
ftell()- ดูตำแหน่งปัจจุบันของ File Pointerrewind()- ย้าย File Pointer กลับไปต้นไฟล์fseek()- ย้าย File Pointer ไปตำแหน่งที่ต้องการ
ftell()
คืนค่าตำแหน่งปัจจุบันของ File Pointer (เป็นจำนวนไบต์จากต้นไฟล์)
long ftell(FILE *fp);
ใช้นับจำนวนอักขระที่เขียนเข้าไฟล์ได้
rewind()
ย้าย File Pointer กลับไปจุดเริ่มต้นของไฟล์
void rewind(FILE *fp);
หลังจาก rewind() แล้ว ftell() จะคืนค่า 0 เสมอ
fseek()
ย้าย File Pointer ไปตำแหน่งที่กำหนด
int fseek(FILE *fp, long offset, int whence);
พารามิเตอร์
- offset - จำนวนไบต์ที่จะเลื่อน (บวก = ไปหน้า, ลบ = ถอยหลัง)
- whence (ตำแหน่งอ้างอิง):
SEEK_SET(0) - จากจุดเริ่มต้นไฟล์SEEK_CUR(1) - จากตำแหน่งปัจจุบันSEEK_END(2) - จากจุดสิ้นสุดไฟล์
ตัวอย่างการใช้ fseek()
| โค้ด | ความหมาย |
|---|---|
| fseek(fp, 0, SEEK_END) | ไปท้ายไฟล์ (offset 0 จากท้าย) |
| fseek(fp, 0, SEEK_SET) | ไปต้นไฟล์ (offset 0 จากต้น) |
| fseek(fp, m, SEEK_SET) | ไปที่ไบต์ที่ m จากต้นไฟล์ |
| fseek(fp, -m, SEEK_END) | ถอยหลัง m ไบต์จากท้ายไฟล์ |
ข้อผิดพลาดที่พบบ่อย
fseek(fp, -m, SEEK_SET)- ไม่สามารถถอยหลังจากต้นไฟล์ได้fseek(fp, +m, SEEK_END) - ไม่สามารถไปข้างหน้าจากท้ายไฟล์ได้
ตัวอย่างโปรแกรม
#include <stdio.h>
int main() {
FILE *fp = fopen("data.txt", "r+");
if(!fp) return 1;
// ไปที่ไบต์ที่ 10 จากต้นไฟล์
fseek(fp, 10, SEEK_SET);
printf("Position: %ld\n", ftell(fp));
// ไปท้ายไฟล์
fseek(fp, 0, SEEK_END);
printf("File size: %ld bytes\n", ftell(fp));
// กลับต้นไฟล์
rewind(fp);
printf("After rewind: %ld\n", ftell(fp));
fclose(fp);
return 0;
}