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

การเรียนรู้การเรียกของระบบ read() ใน C:คู่มือที่ครอบคลุม

ภาษา C มีฟังก์ชันหลายอย่างที่อนุญาตให้อ่านไฟล์ได้ ฟังก์ชันที่ใช้บ่อยที่สุดคือฟังก์ชัน read() และ fread() ภาษานี้ยังจัดเตรียมวิธีการอ่านอักขระทีละอักขระด้วยฟังก์ชัน เช่น getchar()

สิ่งสำคัญคือต้องทราบฟังก์ชันการประมวลผลไฟล์ วิธีการเรียก อาร์กิวเมนต์อินพุตและเอาต์พุต ฯลฯ เพื่อใช้งานได้อย่างคล่องแคล่ว เนื่องจากเป็นทรัพยากรที่โปรแกรมเมอร์มีไว้เพื่อจัดเก็บและกำจัดข้อมูลที่เก็บไว้ในระบบ

ในบทความ Linuxhint นี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน read() เพื่ออ่านไฟล์

เราจะอธิบายทุกอย่างเกี่ยวกับเอลล่านี้ ไวยากรณ์ของมัน การเรียกใช้เมธอด อาร์กิวเมนต์อินพุตและเอาท์พุต ประเภทข้อมูลที่แต่ละอันยอมรับ และวิธีการประกาศอย่างถูกต้อง

จากนั้นเราจะนำสิ่งที่เราเรียนรู้โดยการนำคุณลักษณะนี้ไปใช้เป็นตัวอย่างในทางปฏิบัติ

เพื่อให้คุณทราบอย่างเต็มที่เกี่ยวกับวิธีการใช้ฟังก์ชัน read() เราได้เพิ่มส่วนพิเศษที่อธิบายข้อผิดพลาดทั้งหมดที่อาจเกิดขึ้นเมื่อใช้ฟังก์ชันนี้ เช่นเดียวกับการตรวจจับและการระบุข้อผิดพลาด เพื่อที่คุณจะได้มีเทคนิคที่จำเป็นสำหรับการแก้ไขอย่างรวดเร็วในกรณีที่เกิดข้อผิดพลาด

ไวยากรณ์ของฟังก์ชัน Read() ในภาษา C

 
size_t อ่าน(int fd, โมฆะ *buf, size_t นับ);
 

คำอธิบายของฟังก์ชัน Read()

ฟังก์ชัน read() อ่านเนื้อหาของไฟล์ที่เปิดซึ่งระบุโดยคำอธิบายในอาร์กิวเมนต์อินพุต "fd" ฟังก์ชันนี้จะอ่านและคัดลอกเนื้อหาของไฟล์ลงในบัฟเฟอร์ที่ชี้ไปที่ "buf" พร้อมจำนวนไบต์ ตัวระบุ “fd” เป็นจำนวนเต็มที่ถูกส่งคืนโดยเป็นผลมาจากฟังก์ชัน open() เมื่อเปิดไฟล์

หากฟังก์ชัน read() ส่งคืนสำเร็จ ก็จะส่งคืนจำนวนไบต์ที่อ่าน ผลลัพธ์เท่ากับ 0 หมายความว่าไฟล์ถูกอ่านจนจบ และ -1 หมายความว่ามีข้อผิดพลาดเกิดขึ้น

ข้อผิดพลาดเฉพาะสามารถระบุได้โดยการดึงรหัสจากตัวแปร "errno" ส่วนกลาง หลังจากนั้น คุณจะพบส่วนที่อธิบายข้อผิดพลาดที่อาจเกิดขึ้นเมื่อใช้ฟังก์ชัน read() และเทคนิคในการตรวจจับและระบุข้อผิดพลาด

ฟังก์ชัน read() ได้รับการประกาศในส่วนหัว “unistd.h” หากต้องการใช้งาน คุณต้องรวมไฟล์นี้ไว้ในโค้ดของคุณดังนี้:

วิธีการอ่านไฟล์ด้วยฟังก์ชัน Read()

ในตัวอย่างนี้ เราจะอธิบายวิธีการเปิดและอ่านไฟล์โดยใช้ฟังก์ชัน open() และ read()

เพื่อจุดประสงค์นี้ ก่อนหน้านี้เราได้สร้างไฟล์ข้อความที่มีชื่อ "example.txt" ผ่านทาง Linux Manager และบันทึกไว้ในไดเร็กทอรี "Documents" จากนั้น เราก็เขียนย่อหน้าแรกของบทความนี้ลงไป

ขั้นตอนแรกในการพัฒนาโค้ดเพื่ออ่านไฟล์คือการรวมส่วนหัวที่จำเป็นและสร้างฟังก์ชัน main() ที่ส่งคืนค่าว่าง เรากำหนดจำนวนเต็ม "fd" ซึ่งทำหน้าที่เป็นตัวอธิบายไฟล์ ซึ่งเป็นบัฟเฟอร์ 1,024 อักขระที่เรียกว่า "buff" ซึ่งข้อมูลที่อ่านโดย read() จะถูกเก็บไว้ เส้นทางอาร์เรย์จะเก็บเส้นทางและชื่อของไฟล์ที่เราต้องการอ่าน

หลังจากกำหนดตัวแปรที่จำเป็นแล้ว เราจะเรียกใช้ฟังก์ชัน open() เพื่อเปิดไฟล์ เราเรียกฟังก์ชันนี้โดยการส่งผ่านอาร์เรย์เส้นทางพร้อมกับเส้นทางและชื่อของไฟล์เป็นอาร์กิวเมนต์อินพุตแรก และระบุแฟล็ก O_RDONLY เป็นอาร์กิวเมนต์ที่สอง เนื่องจากเป็นอาร์กิวเมนต์เอาต์พุต เราจะส่งจำนวนเต็ม “fd” โดยที่ open() ส่งคืนคำอธิบายที่เราใช้ในการอ่านไฟล์

เมื่อเราเปิดไฟล์แล้ว เราจะอ่านเนื้อหาโดยเรียกใช้ฟังก์ชัน read() และส่งผ่านตัวอธิบาย “fd” เป็นอาร์กิวเมนต์แรกที่ฟังก์ชัน open() ส่งคืน สำหรับอาร์กิวเมนต์ที่สอง เราจะส่งตัวชี้ไปยังบัฟเฟอร์ "buff" ซึ่งเราจัดเก็บเนื้อหาที่จะอ่าน และสุดท้ายขนาดของบัฟเฟอร์ซึ่งในกรณีนี้คือ 1024 ไบต์

จากนั้นเราใช้ฟังก์ชัน printf() เพื่อแสดงเนื้อหาที่เก็บไว้ใน buff ในคอนโซลคำสั่ง นี่คือโค้ดที่สมบูรณ์สำหรับตัวอย่างนี้:

#รวม
#รวม
#รวม
#รวม

int หลัก()
{  
   อินท์เอฟดี;
   ถ่านบัฟ [1024];
   เส้นทางถ่าน[] ="เอกสาร/example.txt";
   fd =เปิด (เส้นทาง, O_RDONLY);
   อ่าน(fd, บัฟ, 1024);
   printf("\n\n%s\n\n",บัฟ);
   

ในรูปต่อไปนี้ เราจะเห็นการคอมไพล์และการดำเนินการของโค้ดนี้ ดังที่เราเห็น read() ใส่เนื้อหาทั้งหมดของไฟล์ “example.txt” ลงใน “buff” และฟังก์ชัน printf() จะพิมพ์ลงในคอนโซลคำสั่ง:

การเรียนรู้การเรียกของระบบ read() ใน C:คู่มือที่ครอบคลุม

วิธีการตรวจจับและระบุข้อผิดพลาดที่อาจเกิดขึ้นเมื่อใช้ฟังก์ชัน Read()

การใช้ read() อาจทำให้เกิดข้อผิดพลาดต่างๆ ได้ เมื่อสิ่งนี้เกิดขึ้น ฟังก์ชันนี้จะส่งคืนผลลัพธ์ที่เท่ากับ -1

วิธีที่ง่ายที่สุดในการตรวจสอบว่าเกิดข้อผิดพลาดหรือไม่คือการใช้เงื่อนไข "if" โดยที่เงื่อนไขคือค่าที่ส่งคืนเป็น -1 ตอนนี้เรามาดูกันว่าคุณสามารถใช้วิธีนี้เพื่อตรวจสอบว่าเกิดข้อผิดพลาดได้อย่างไร:

อินท์เอ็น;
n =อ่าน (fd, บัฟ, 1024);
ถ้า ( n ==-1){
     printf ("เกิดข้อผิดพลาดขณะพยายามอ่านไฟล์");
     

หากฟังก์ชัน read() กลับมาพร้อมข้อผิดพลาด ฟังก์ชันจะเปลี่ยนไปใช้คำสั่ง "if" และพิมพ์ข้อความ "An error allowanceed while try to read the file"

เมื่อเกิดข้อผิดพลาด รหัสตัวเลขจะถูกจัดเก็บโดยอัตโนมัติในตัวแปร “errno” ส่วนกลางซึ่งกำหนดไว้ในส่วนหัว “errno.h” รหัสนี้สามารถใช้เพื่อระบุข้อผิดพลาดที่เกิดขึ้น

ต่อไปนี้เป็นข้อความที่ตัดตอนมาพร้อมข้อผิดพลาดที่ฟังก์ชัน read() สามารถสร้างได้และถูกกำหนดไว้ในส่วนหัว “errno.h” พร้อมด้วยคำอธิบายโดยย่อของแต่ละข้อผิดพลาดและค่าจำนวนเต็มที่เกี่ยวข้อง:

ค่าคำจำกัดความใน errno ข้อผิดพลาดEAGAIN 11ลองอีกครั้งEBADF 9หมายเลขไฟล์ไม่ถูกต้องEDESTADDRREQ 89ต้องมีที่อยู่ปลายทางEFAULT 14ที่อยู่ไม่ถูกต้องEFBIG 27ไฟล์ใหญ่เกินไปEINTR 4การโทรของระบบถูกขัดจังหวะEINVAL 22อาร์กิวเมนต์ไม่ถูกต้องEIO 5 ข้อผิดพลาด I/OEPERM 1ไม่อนุญาตให้ดำเนินการ

วิธีที่ง่ายที่สุดในการระบุข้อผิดพลาดคือการเปิดสวิตช์โดยที่ตัวแปร "errno" เป็นเงื่อนไขการกระโดด และแต่ละกรณีเป็นคำจำกัดความของข้อผิดพลาด

ต่อไป ให้เราดูตัวอย่างที่เราพยายามป้อนคำอธิบายที่มีเครื่องหมายลบ ส่งผลให้เกิดข้อผิดพลาด เพื่อระบุข้อผิดพลาด เราใช้เงื่อนไข "ถ้า" ที่เราเห็นในตัวอย่างข้อมูลก่อนหน้า เพื่อระบุสิ่งนี้ เราจะเปิดสวิตช์ที่มีข้อผิดพลาดทั่วไปสามประการที่ฟังก์ชันนี้สามารถสร้างขึ้นได้

#รวม
#รวม
#รวม
#รวม
#รวม

int หลัก()
{  
   อินท์ fd,n;
   ถ่านบัฟ [1024];
   เส้นทางถ่าน[] ="เอกสาร/example.txt";
   fd =เปิด (เส้นทาง, O_RDONLY);

   n =อ่าน (99999999, บัฟ, 1024);
   ถ้า (n ==-1){
      สวิตช์ (เอ่อ) {
    กรณี EBADF:{
                  printf("หมายเลขไฟล์ไม่ถูกต้อง ข้อผิดพลาด:%i\n", errno);
                  แตก;}
    กรณี EINVAL:{
                   printf("อาร์กิวเมนต์ไม่ถูกต้อง ข้อผิดพลาด:%i\n", errno);
                   แตก;}
    กรณี EIO:{
                printf("ข้อผิดพลาด I/O . ข้อผิดพลาด:%i\n", errno);
                แตก;}
    }
 }

ดังที่เราเห็นในรูปต่อไปนี้ ฟังก์ชัน read() ส่งกลับข้อผิดพลาดเมื่อมีการส่ง descriptor ที่ไม่ถูกต้องเป็นอาร์กิวเมนต์อินพุต และค่าที่ดึงมาจากตัวแปร "errno" ที่ใช้เป็นเงื่อนไขการกระโดดช่วยให้เราสามารถระบุข้อผิดพลาดเมื่อเข้าสู่กรณี EBADF

การเรียนรู้การเรียกของระบบ read() ใน C:คู่มือที่ครอบคลุม

บทสรุป

ในบทความ Linuxhint นี้ เราได้แสดงให้คุณเห็นถึงวิธีการใช้ฟังก์ชัน read() ซึ่งเป็นหนึ่งในฟังก์ชันทั่วไปที่ใช้งานในภาษา C เพื่ออ่านไฟล์

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

เพื่อให้มีวิธีที่จำเป็นในการแก้ไขข้อผิดพลาดที่อาจเกิดขึ้นเมื่อใช้ฟังก์ชันนี้ เราได้เพิ่มส่วนพิเศษที่อธิบายวิธีการที่ภาษา C จัดเตรียมไว้เพื่อตรวจจับและระบุข้อผิดพลาด