สัปดาห์ที่ 5 File Processing

จุดประสงค์การเรียนรู้

  1. อ่านและเขียนไฟล์ข้อความและไฟล์ไบนารีได้
  2. ใช้ File Stream และจัดการข้อผิดพลาดของไฟล์ได้
  3. สร้างโปรแกรมจัดเก็บข้อมูลลงไฟล์ได้

เนื้อหา

File I/O

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

Stream

Stream ทำให้การรับส่งข้อมูลระหว่างโปรแกรมและไฟล์เป็นลำดับต่อเนื่อง ผู้เรียนจะฝึกใช้ File Stream เพื่ออ่านเขียนข้อมูลทีละบรรทัดหรือทีละชุดข้อมูล

Exception

การทำงานกับไฟล์มีโอกาสเกิดข้อผิดพลาดสูง จึงต้องมีการตรวจสอบและจัดการข้อผิดพลาด เช่น try-catch, return code หรือข้อความแจ้งเตือนที่เหมาะสม

Workshop

สร้างโปรแกรมบันทึกและโหลดข้อมูลจากไฟล์ พร้อมตรวจสอบกรณีไฟล์หายหรือรูปแบบข้อมูลไม่ถูกต้อง

รายละเอียดการเรียนรู้

ผู้เรียนเรียนรู้การทำให้ข้อมูลอยู่รอดหลังปิดโปรแกรมผ่านการบันทึกลงไฟล์ โดยเปรียบเทียบไฟล์ข้อความที่อ่านง่ายกับไฟล์ไบนารีที่เหมาะกับข้อมูลเฉพาะรูปแบบ การออกแบบรูปแบบไฟล์ต้องกำหนดตัวคั่นข้อมูล ลำดับ field และวิธีจัดการข้อมูลที่มีอักขระพิเศษ

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

แนวปฏิบัติ

  1. ตรวจสอบผลลัพธ์ของการเปิดไฟล์ทุกครั้ง
  2. แยกฟังก์ชัน load และ save
  3. เขียนไฟล์แบบปลอดภัย เช่น เขียนไฟล์ชั่วคราวก่อนแทนที่ไฟล์จริง
  4. ตรวจรูปแบบข้อมูลก่อนนำเข้าโปรแกรม

แบบฝึกหัด

ต่อยอดโปรแกรม Structure จากสัปดาห์ที่ 4 ให้สามารถบันทึกและโหลดข้อมูลจากไฟล์ได้

รูปแบบการนำเสนอเพิ่มเติมตามแม่แบบ

File Processing คือการอ่าน เขียน และจัดการข้อมูลถาวรในไฟล์ โปรแกรมที่ดีต้องตรวจสอบสถานะไฟล์และจัดการกรณีผิดพลาด เช่น ไฟล์ไม่มีอยู่ ข้อมูลไม่ครบ หรือรูปแบบข้อมูลไม่ถูกต้อง

%%{init: {'theme': 'base', 'themeVariables': {
  'background': '#282828',
  'primaryColor': '#3c3836',
  'primaryTextColor': '#fbf1c7',
  'primaryBorderColor': '#fabd2f',
  'lineColor': '#fe8019',
  'secondaryColor': '#504945',
  'tertiaryColor': '#665c54',
  'fontFamily': 'Arial'
}}}%%
flowchart LR
  A[Open File
เปิดไฟล์] --> B{Success?
สำเร็จหรือไม่} B -- Yes --> C[Read/Write
อ่าน/เขียน] B -- No --> D[Handle Error
จัดการข้อผิดพลาด] C --> E[Validate Data
ตรวจข้อมูล] E --> F[Close File
ปิดไฟล์]

สมการขนาดไฟล์โดยประมาณ

S=r×f×b

ตัวอย่างโค้ดทดลอง

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ofstream out("students.txt"); // เปิดไฟล์สำหรับเขียน
    if (!out) {
        cout << "Cannot open file" << endl;
        return 1;
    }

    out << "66001,Anan" << endl; // บันทึกข้อมูลตัวอย่าง
    out.close();

    ifstream in("students.txt"); // เปิดไฟล์สำหรับอ่าน
    string line;
    while (getline(in, line)) {
        cout << line << endl; // expected: 66001,Anan
    }
    return 0;
}
กรณีผิดพลาด ผลกระทบ แนวทางจัดการ
File Not Found อ่านข้อมูลไม่ได้ แจ้งผู้ใช้หรือสร้างไฟล์ใหม่
Invalid Format แปลงข้อมูลผิด validate ก่อนใช้
Permission Denied เขียนไฟล์ไม่ได้ แจ้งสิทธิ์หรือเปลี่ยน path

กลับรายวิชา