
บทนำ
ภาษา C มีฟังก์ชันหลายตัวสำหรับอ่านไฟล์ โดยที่ใช้กันมากที่สุดคือ read() และ fread() นอกจากนี้ยังมีฟังก์ชันสำหรับอ่านตัวอักษรทีละตัว เช่น getchar() การเข้าใจฟังก์ชันประมวลผลไฟล์ วิธีการเรียกใช้ พารามิเตอร์นำเข้าและส่งออก เป็นสิ่งจำเป็นสำหรับนักพัฒนา เพื่อจัดเก็บและจัดการข้อมูลที่เก็บอยู่ในระบบได้อย่างมีประสิทธิภาพ
ในบทความนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน read() เพื่ออ่านไฟล์ รวมถึงไวยากรณ์ การทำงาน พารามิเตอร์นำเข้า/ส่งออก ชนิดข้อมูลที่รองรับ และวิธีประกาศให้ถูกต้อง พร้อมกับตัวอย่างปฏิบัติจริง และส่วนพิเศษสำหรับการตรวจจับและระบุข้อผิดพลาดที่อาจเกิดขึ้น
ไวยากรณ์ของฟังก์ชัน read()
size_t read(int fd, void *buf, size_t count);
คำอธิบายการทำงานของ read()
ฟังก์ชัน read() ใช้สำหรับอ่านเนื้อหาของไฟล์ที่เปิดอยู่ ซึ่งระบุโดย file descriptor (fd) ฟังก์ชันนี้จะอ่านและคัดลอกเนื้อหาไฟล์เข้าไปในบัฟเฟอร์ที่ชี้โดย buf จำนวน count ไบต์ ตัวระบุ fd เป็นจำนวนเต็มที่ได้จากการเรียกฟังก์ชัน open() เมื่อเปิดไฟล์
ค่าส่งกลับ (Return Values):
- มากกว่า 0 - จำนวนไบต์ที่อ่านได้สำเร็จ
- เท่ากับ 0 - อ่านจนถึงปลายไฟล์ (EOF)
- เท่ากับ -1 - เกิดข้อผิดพลาด
รหัสข้อผิดพลาดเฉพาะสามารถระบุได้จากตัวแปร global errno ซึ่งจะมีรายละเอียดในส่วนต่อไป
ฟังก์ชัน read() ประกาศอยู่ในไฟล์หัวข้อ unistd.h ต้อง include ไฟล์นี้ก่อนใช้งาน:
#include <unistd.h>
ตัวอย่างการอ่านไฟล์ด้วย read()
ในตัวอย่างนี้ เราจะสร้างไฟล์ข้อความชื่อ "example.txt" ในไดเรกทอรี Documents แล้วอ่านเนื้อหาด้วย open() และ read()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd;
char buff[1024];
char path[] = "Documents/example.txt";
// เปิดไฟล์แบบอ่านอย่างเดียว
fd = open(path, O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return EXIT_FAILURE;
}
// อ่านเนื้อหาไฟล์
ssize_t bytes_read = read(fd, buff, 1024);
if (bytes_read == -1) {
perror("Error reading file");
close(fd);
return EXIT_FAILURE;
}
// แสดงผลลัพธ์
buff[bytes_read] = '\0'; // เพิ่ม null terminator
printf("\n\n%s\n\n", buff);
close(fd);
return 0;
}

การตรวจจับและระบุข้อผิดพลาดของ read()
เมื่อ read() เกิดข้อผิดพลาด จะคืนค่า -1 และตั้งค่ารหัสข้อผิดพลาดในตัวแปร errno (ประกาศใน errno.h)
วิธีตรวจสอบข้อผิดพลาดพื้นฐาน
int n;
n = read(fd, buff, 1024);
if (n == -1) {
printf("An error occurred while trying to read the file.");
}
รหัสข้อผิดพลาดทั่วไปของ read()
| Error Code | Value | คำอธิบาย |
|---|---|---|
| EAGAIN | 11 | ลองใหม่ (Resource temporarily unavailable) |
| EBADF | 9 | File descriptor ไม่ถูกต้อง |
| EFAULT | 14 | ที่อยู่บัฟเฟอร์ไม่ถูกต้อง |
| EINTR | 4 | System call ถูกขัดจังหวะโดยสัญญาณ |
| EINVAL | 22 | อาร์กิวเมนต์ไม่ถูกต้อง |
| EIO | 5 | ข้อผิดพลาด I/O |
| EPERM | 1 | การดำเนินการไม่ได้รับอนุญาต |
ตัวอย่างการระบุข้อผิดพลาดด้วย switch-case
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main() {
int fd, n;
char buff[1024];
char path[] = "Documents/example.txt";
fd = open(path, O_RDONLY);
// ส่ง fd ที่ไม่ถูกต้องเพื่อทดสอบข้อผิดพลาด
n = read(99999999, buff, 1024);
if (n == -1) {
switch(errno) {
case EBADF:
printf("Bad file number. Error: %i\n", errno);
break;
case EINVAL:
printf("Invalid argument. Error: %i\n", errno);
break;
case EIO:
printf("I/O error. Error: %i\n", errno);
break;
default:
printf("Other error: %i\n", errno);
}
}
return 0;
}

สรุป
บทความนี้ได้อธิบายการใช้งานฟังก์ชัน read() ซึ่งเป็นหนึ่งในฟังก์ชันที่ใช้กันมากที่สุดในภาษา C สำหรับอ่านไฟล์ ครอบคลุมถึงไวยากรณ์ ทฤษฎีการทำงาน พารามิเตอร์นำเข้า/ส่งออก ชนิดข้อมูล ตัวอย่างโค้ดปฏิบัติจริง พร้อมภาพประกอบ และส่วนสำคัญคือเทคนิคการตรวจจับและระบุข้อผิดพลาด เพื่อให้นักพัฒนาสามารถแก้ไขปัญหาได้อย่างรวดเร็วและแม่นยำ