Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

เรียนรู้ System Call read() ในภาษา C: คู่มือฉบับสมบูรณ์

เรียนรู้ System Call read() ในภาษา C: คู่มือฉบับสมบูรณ์

บทนำ

ภาษา 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;
}

เรียนรู้ System Call read() ในภาษา C: คู่มือฉบับสมบูรณ์

การตรวจจับและระบุข้อผิดพลาดของ 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 คำอธิบาย
EAGAIN11ลองใหม่ (Resource temporarily unavailable)
EBADF9File descriptor ไม่ถูกต้อง
EFAULT14ที่อยู่บัฟเฟอร์ไม่ถูกต้อง
EINTR4System call ถูกขัดจังหวะโดยสัญญาณ
EINVAL22อาร์กิวเมนต์ไม่ถูกต้อง
EIO5ข้อผิดพลาด I/O
EPERM1การดำเนินการไม่ได้รับอนุญาต

ตัวอย่างการระบุข้อผิดพลาดด้วย 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;
}

เรียนรู้ System Call read() ในภาษา C: คู่มือฉบับสมบูรณ์

สรุป

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