0Pricing
C++ Academy · บทเรียน

การจัดการข้อผิดพลาดและสถานะ

ตรวจสอบสถานะสตรีม

การจัดการข้อผิดพลาดและสถานะ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

บิตสถานะของสตรีม

สตรีมทุกตัวจะติดตามสถานะของตนเองด้วยแฟล็กสถานะ:

  • บิตสถานะปกติ: ทุกอย่างทำงานเป็นปกติ
  • บิตจุดสิ้นสุดไฟล์: อ่านถึงจุดสิ้นสุดไฟล์แล้ว
  • บิตสถานะล้มเหลว: เกิดข้อผิดพลาดทางตรรกะ (รูปแบบไม่ถูกต้อง)
  • บิตสถานะผิดปกติ: เกิดข้อผิดพลาดร้ายแรงในการรับส่งข้อมูล
#include <iostream>
#include <fstream>

int main() {
    std::ifstream in("missing_98765.txt");
    std::cout << std::boolalpha << "good: " << in.good() << '\n';
    return 0;
}

การทดสอบสตรีม

สตรีมสามารถแปลงเป็น bool ได้ โดยจะเป็น true เมื่อใช้งานได้ การใช้ if (!in) ช่วยตรวจจับความล้มเหลวได้อย่างกระชับ

#include <iostream>
#include <fstream>

int main() {
    std::ifstream in("nope_55555.txt");
    if (!in) std::cout << "stream not usable\n";
    else std::cout << "ok\n";
    return 0;
}

good, eof, fail, bad

แต่ละแฟล็กมีเมธอดสำหรับตรวจสอบ ได้แก่ good(), eof(), fail() และ bad()

#include <iostream>
#include <sstream>

int main() {
    std::istringstream s("abc");
    int x;
    s >> x; // fails: not a number
    std::cout << std::boolalpha;
    std::cout << "fail: " << s.fail() << '\n';
    std::cout << "bad: " << s.bad() << '\n';
    return 0;
}

การดึงข้อมูลที่ล้มเหลว

เมื่อ >> ไม่สามารถแยกวิเคราะห์ชนิดข้อมูลที่คาดไว้ได้ มันจะตั้งค่า failbit และปล่อยให้เป้าหมายคงค่าเดิม

#include <iostream>
#include <sstream>

int main() {
    std::istringstream s("hello");
    int n = -1;
    if (!(s >> n)) std::cout << "could not read an int, n stays " << n << '\n';
    return 0;
}

การล้างสถานะ

เมื่อมีการตั้งค่าแฟล็กล้มเหลวแล้ว สตรีมจะยังใช้งานไม่ได้จนกว่าคุณจะเรียก clear() เพื่อตั้งค่าใหม่

#include <iostream>
#include <sstream>

int main() {
    std::istringstream s("x 42");
    int n;
    s >> n;          // fails on 'x'
    s.clear();       // reset state
    std::string word;
    s >> word;       // now reads 'x'
    std::cout << "recovered: " << word << '\n';
    return 0;
}

การละเว้นข้อมูลเข้าที่ไม่ถูกต้อง

หลังจากเรียก clear() ให้ใช้ ignore() เพื่อละทิ้งอักขระที่ก่อปัญหาก่อนลองใหม่

#include <iostream>
#include <sstream>
#include <limits>

int main() {
    std::istringstream s("bad 100");
    int n;
    while (!(s >> n)) {
        s.clear();
        s.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
    }
    std::cout << "read " << n << '\n';
    return 0;
}

การแยก EOF ออกจากข้อผิดพลาด

หลังจากลูปอ่านข้อมูลสิ้นสุด ให้ตรวจสอบว่าจบลงอย่างเรียบร้อยด้วย eof() หรือเกิดความล้มเหลวจริงด้วย bad()

#include <iostream>
#include <sstream>

int main() {
    std::istringstream s("1 2 3");
    int x;
    while (s >> x) {}
    std::cout << std::boolalpha << "reached eof: " << s.eof() << '\n';
    std::cout << "hardware error: " << s.bad() << '\n';
    return 0;
}

การตรวจสอบหลังเปิดไฟล์

โปรดตรวจสอบสตรีมทันทีหลังเปิดไฟล์ทุกครั้ง เพื่อให้พบปัญหาอย่างรวดเร็วเมื่อเส้นทางไม่มีอยู่หรือไม่สามารถอ่านได้

#include <iostream>
#include <fstream>

int main() {
    std::ifstream in("absent_11111.txt");
    if (!in.is_open()) {
        std::cout << "open failed, aborting\n";
        return 1;
    }
    std::cout << "never reached\n";
    return 0;
}

การเปิดใช้ exceptions

คุณสามารถขอให้สตรีมโยนข้อยกเว้นเมื่อเกิดข้อผิดพลาดด้วย exceptions() เพื่อเปลี่ยนความล้มเหลวที่ไม่แสดงผลให้เป็น std::ios_base::failure ที่สามารถดักจับได้

#include <iostream>
#include <fstream>

int main() {
    std::ifstream in;
    in.exceptions(std::ios::failbit);
    try {
        in.open("ghost_22222.txt");
    } catch (const std::exception& e) {
        std::cout << "caught open failure\n";
    }
    return 0;
}

การตรวจสอบจำนวน read

หลังจากใช้ read แบบไบนารี gcount() จะรายงานจำนวนไบต์ที่อ่านได้จริง ทำให้คุณตรวจจับการอ่านที่ได้ข้อมูลไม่ครบได้

#include <iostream>
#include <fstream>

int main() {
    int v = 9;
    std::ofstream("g.bin", std::ios::binary).write(reinterpret_cast<const char*>(&v), sizeof(v));
    int out;
    std::ifstream in("g.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(&out), sizeof(out));
    std::cout << "read " << in.gcount() << " bytes\n";
    return 0;
}

ลูป read ที่ทนทาน

ผสานเทคนิคต่าง ๆ เข้าด้วยกัน โดยทดสอบสตรีมภายในลูป จากนั้นเมื่อจบลูปให้แยกแยะการจบอย่างเรียบร้อยออกจากข้อผิดพลาด

#include <iostream>
#include <sstream>

int main() {
    std::istringstream s("5 10 15");
    int total = 0, x;
    while (s >> x) total += x;
    if (s.eof()) std::cout << "sum = " << total << " (clean)\n";
    else std::cout << "error during read\n";
    return 0;
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับสถานะสตรีม

ทบทวน

คุณได้เรียนรู้การจัดการข้อผิดพลาดของสตรีมดังนี้:

  • แฟล็กสถานะ good/eof/fail/bad ซึ่งตรวจสอบได้ผ่านเมธอดของแฟล็กเหล่านั้น หรือทดสอบสตรีมในฐานะค่า bool
  • clear() จะรีเซ็ตสถานะ และ ignore() จะละทิ้งข้อมูลเข้าที่ไม่ถูกต้อง
  • แยกการจบอย่างเรียบร้อยด้วย eof() ออกจากข้อผิดพลาดจริง ส่วน exceptions() สามารถโยนข้อยกเว้น และ gcount() ใช้ตรวจสอบการอ่านข้อมูลไบนารีได้

หลักสูตรถัดไป: การสร้างตัวเลขสุ่มด้วย <random>

คำถามที่พบบ่อย

บทเรียน “การจัดการข้อผิดพลาดและสถานะ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและสถานะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและสถานะ”

ตรวจสอบสถานะสตรีม คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดการข้อผิดพลาดและสถานะ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การอ่านไฟล์ด้วย ifstream
  2. การเขียนไฟล์ด้วย ofstream
  3. อินพุต/เอาต์พุตไฟล์ไบนารี
  4. การจัดการข้อผิดพลาดและสถานะ
← กลับไปที่ C++ Academy