Monday, December 16, 2013

โปรแกรมภาษา C++ : ตอนการอ่านข้อมูลจาก Binary File (How to read the binary file)

สวัสดีครับ บทความนี้เป็นบทความต่อจาก การเขียนโปรแกรมภาษา C++ สำหรับการบันทึกข้อมูล Binary file โดยในบทความนี้จะเสนอการอ่านหรือโหลดข้อมูลจาก Binary File จากเรื่องการบันทึกข้อมูล ท่านผู้อ่านคงจำได้ว่า Binary File เป็นไฟล์ที่มีการเก็บข้อมูลแบบเป็นโครงสร้างและเรียงลำดับอย่างเป็นระบบ ซึ่งหากโปรแกรมเมอร์ต้องการเข้าไปอ่านหรือโหลดข้อมูลจากไฟล์เหล่านี้มาใช้งาน จำเป็นอย่างยิ่งที่ต้องรู้จักโครงสร้างของข้อมูลดังกล่าว ยกตัวอย่างเช่น การเปิดไฟล์ภาพชนิดต่างๆ หรือไฟล์เสียงต่างๆ หรือแม้กระทั่งไฟล์จากโปรแกรม Microsoft office ทั้งหลาย หากเรารู้จักโครงสร้างของมันเราก็จะเข้าไปอ่านข้อมูลได้เช่นกัน  ดังนั้นจึงจำเป็นต้องพัฒนาโปรแกรมที่รู้จักโครงสร้างการเก็บข้อมูลของ Binary File นั้นๆครับ ขอยกตัวอย่าง Code Program ภาษา C++ ที่ได้นำเสนอการบันทึกข้อมูลลงไฟล์ DATA.bin ไปแล้วนะครับ การเข้าไปอ่านข้อมูลจำเป็นอย่างยิ่งที่ต้องกำหนดตำแหน่งในการเข้าถึงข้อมูลและกำหนดขนาดของข้อมูลที่ต้องการโหลดมาใช้งาน โดยจะใช้ฟังก์ชัน fread ในการเข้าถึงตำแหน่งข้อมูลและโหลดข้อมูล 
โดยลำดับแรก จะต้องกำหนดตัวแปรที่ใช้เก็บข้อมูล มาดู Code Program กันครับ


เมื่อคอมไพล์โปรแกรมจะปรากฏเลข 1 - 100 บนหน้าจอ จาก Code Program ดังกล่าวเป็นการอ่านหรือโหลดข้อมูลตั้งแต่ลำดับแรกจนถึงลำดับสุดท้ายจากไฟล์ DATA.bin โดยโปรแกรมเมอร์ทราบอยู่แล้วว่ามีข้อมุลชนิด INT เก็บในไฟล์ DATA จำนวน 100 ชุด ในกรณีที่ต้องการอ่านข้อมูลที่ละชุดไล่ไปเรื่อยๆจนหมด (ตรวจสอบโดยฟังก์ชัน feof() ) สามารถเขียน Code Program ได้ดังนี้ ซึ่งจะได้ผลลัพธ์เหมือน Code Program ก่อนหน้านี้



ในกรณีต้องการระบุตำแหน่งที่จะเริ่มอ่านข้อมูล เราจะต้องอาศัยฟังก์ชัน fseek ในการเลื่อนพอย์เตอร์ไปยังตำแหน่งที่ระบุ ดังตัวอย่าง Code Program ที่ต้องการอ่านข้อมูลในอาเรย์ตัวที่ 3 จนถึงตัวที่ 5 


ผลการคอมไพล์ Code Program ดังกล่าวจะปรากฎเลข 3 4 5 เรียงกันบนหน้าจอ 
มาถึงตรงนี้โปรแกรมเมอร์ภาษาซีทุกท่านคงจะเข้าใจถึงวิธีการอ่านหรือโหลดข้อมูลในไฟล์ Binary กันแล้วนะครับ และจะเห็นว่าเราสามารถบริหารจัดการข้อมูลที่อ่านมาได้อย่างง่ายๆครับ เพียงเราทราบโครงสร้างของไฟล์ดังกล่าว ก่อนจบมีโจทย์เล็กๆให้ปรับปรุงนะครับ สมมุติเราไม่ทราบจำนวนชุดข้อมูลที่อยู่ในไฟล์ดังกล่าว เราจะต้องทำอย่างไรถึงจะอ่านข้อมูลและนำข้อมูลที่อ่านได้มาเก็บไว้ในตัวแปรเพื่อใช้งานต่อไป 
ผมแนะนำฟังก์ชัน fseek และการระบุตำแหน่งพอย์เตอร์ไปยังจุดสุดท้ายของไฟล์ด้วย SEEK_END และรอ่านขนาดของไฟล์ด้วยฟังก์ชัน ftell(fp) จากนั้นท่านสามารถคำนวณหาจำนวนชุดข้อมูลด้วยการหารขนาดของไฟล์ด้วยขนาดของชนิดตัวแปร ใช้ fseek และระบุด้วย SEEK_SET เพื่อเลื่อนพอยเตอร์มายังจุดเริ่มต้นของไฟล์ และเมื่อเราทราบจำนวนชุดของตัวแปรแล้ว เราสามารถใช้วิธีการสร้างอาเรย์แบบไดนามิกส์ที่ได้นำเสนอมาแล้วช่วยในการเก็บบันทึกข้อมูลครับ มาดู Code Program กันครับ




1 comment :

  1. ขอแก้ไข code program ที่ 3 บรรทัดที่ 9 เป็น
    fssek(fp,2*4,SEEK_CUR); // JUMP TO ข้อมูลตัวที่ 3

    ReplyDelete