การทำงานกับ std::cerr และ std::clog
แยกข้อมูลวินิจฉัยและบันทึกเหตุการณ์ออกจากผลลัพธ์ของโปรแกรมด้วยกระแสข้อมูล cerr และ clog
การทำงานกับ std::cerr และ std::clog เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
สตรีมผลลัพธ์สามแบบ
ไลบรารีมาตรฐานมีสตรีมผลลัพธ์ที่กำหนดไว้ล่วงหน้าสามแบบ:
- std::cout — ผลลัพธ์มาตรฐานแบบมีบัฟเฟอร์
- std::cerr — ข้อผิดพลาดมาตรฐานแบบไม่มีบัฟเฟอร์
- std::clog — ข้อผิดพลาดมาตรฐานแบบมีบัฟเฟอร์
std::cerr: ข้อผิดพลาดและคำเตือน
std::cerr เขียนไปยังช่องทางข้อผิดพลาดมาตรฐานและเป็นแบบไม่มีบัฟเฟอร์ — เอาต์พุตจะแสดงทันที แม้โปรแกรมจะขัดข้องในเวลาต่อมา
std::cerr << "Error: file not found\n";std::clog: บันทึกแบบมีบัฟเฟอร์
std::clog เขียนไปยังช่องทางข้อผิดพลาดมาตรฐานเช่นกัน แต่เป็นแบบมีบัฟเฟอร์เหมือน cout ใช้สำหรับบันทึกข้อมูลตามปกติที่ยอมรับความหน่วงเล็กน้อยได้
std::clog << "[info] processing record 42\n";เหตุใดจึงมีสตรีมสองสายสำหรับข้อผิดพลาดมาตรฐาน
ข้อผิดพลาดควรแสดงทันที เพื่อให้ผู้ใช้เห็นก่อนโปรแกรมขัดข้อง ส่วนบันทึกข้อมูลมีปริมาณมาก — การใช้บัฟเฟอร์ช่วยให้ประสิทธิภาพอยู่ในระดับที่ยอมรับได้
การเปลี่ยนเส้นทางเอาต์พุต
บนบรรทัดคำสั่ง เอาต์พุตมาตรฐานและช่องทางข้อผิดพลาดมาตรฐานจะไปยังช่องทางที่แยกจากกัน ควรเปลี่ยนเส้นทางแต่ละช่องทางอย่างอิสระ
# Send stdout to a file, stderr to the terminal
./app > out.txt
# Send stderr to a file too
./app 2> err.txt
# Send both to one file
./app > all.txt 2>&1เอาต์พุตวินิจฉัยเทียบกับเอาต์พุตข้อมูล
ตามธรรมเนียม ข้อมูลที่เครื่องอ่านได้ควรส่งไปยังเอาต์พุตมาตรฐาน ส่วนข้อมูลวินิจฉัยสำหรับมนุษย์ควรส่งไปยังช่องทางข้อผิดพลาดมาตรฐาน วิธีนี้ช่วยให้สายงานประมวลผลทำงานได้อย่างเป็นระเบียบ
การเชื่อมสตรีมเข้าด้วยกัน
cin จะเชื่อมโยงกับ cout โดยค่าเริ่มต้น — การอ่านจาก cin จะล้างบัฟเฟอร์ของ cout ก่อน ส่วน cerr ก็เชื่อมโยงกับ cout ในลักษณะเดียวกัน
การบันทึกข้อมูลแบบกำหนดระดับเอง
ห่อหุ้ม clog ไว้ในฟังก์ชันช่วยเหลือเพื่อแบ่งระดับการบันทึกข้อมูล — INFO, WARN, ERROR วิธีนี้ช่วยให้ข้อความบันทึกมีรูปแบบสม่ำเสมอ
void warn(const std::string& msg) {
std::clog << "[WARN] " << msg << "\n";
}
void error(const std::string& msg) {
std::cerr << "[ERROR] " << msg << "\n";
}ประสิทธิภาพ: cerr ทำงานช้า
เนื่องจาก cerr ล้างบัฟเฟอร์ทุกการทำงาน การเขียนซ้ำหลายครั้งจึงช้า หากต้องบันทึกข้อมูลปริมาณมาก ควรใช้ clog หรือไลบรารีบันทึกข้อมูลโดยเฉพาะ
การล้างบัฟเฟอร์ clog ด้วยตนเอง
หากต้องการให้เอาต์พุตของ clog แสดงทันทีเพื่อการแก้ไขข้อบกพร่อง ให้ล้างบัฟเฟอร์ด้วยตนเอง
std::clog << "checkpoint" << std::flush;การเขียนลงสตรีมไฟล์
รูปแบบเดียวกันนี้ใช้ได้กับสตรีมไฟล์ เปิดไฟล์บันทึกด้วย std::ofstream แล้วส่งข้อมูลเข้าไปในลักษณะเดียวกับ clog
std::ofstream logFile("app.log");
logFile << "Application started\n";ตรวจสอบอย่างรวดเร็ว
สตรีมมาตรฐานใดจะถูกล้างบัฟเฟอร์โดยอัตโนมัติหลังการเขียนทุกครั้ง
สรุปทบทวน
ใช้ std::cout สำหรับเอาต์พุตปกติ ใช้ std::cerr สำหรับข้อผิดพลาดเร่งด่วนที่ไม่มีบัฟเฟอร์ และใช้ std::clog สำหรับบันทึกข้อมูลแบบมีบัฟเฟอร์ เปลี่ยนเส้นทางแต่ละสตรีมอย่างอิสระในเชลล์ด้วย > และ 2>
คำถามที่พบบ่อย
บทเรียน “การทำงานกับ std::cerr และ std::clog” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทำงานกับ std::cerr และ std::clog” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทำงานกับ std::cerr และ std::clog”
แยกข้อมูลวินิจฉัยและบันทึกเหตุการณ์ออกจากผลลัพธ์ของโปรแกรมด้วยกระแสข้อมูล cerr และ clog คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การทำงานกับ std::cerr และ std::clog” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ std::cin และ std::cout อย่างถูกต้อง
- การจัดรูปแบบผลลัพธ์ด้วย iomanip
- การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline
- การทำงานกับ std::cerr และ std::clog