การจัดการข้อผิดพลาดและสถานะ
ตรวจสอบสถานะสตรีม
การจัดการข้อผิดพลาดและสถานะ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ่านไฟล์ด้วย ifstream
- การเขียนไฟล์ด้วย ofstream
- อินพุต/เอาต์พุตไฟล์ไบนารี
- การจัดการข้อผิดพลาดและสถานะ