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

การทำงานกับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การใช้ std::cin และ std::cout อย่างถูกต้อง
  2. การจัดรูปแบบผลลัพธ์ด้วย iomanip
  3. การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline
  4. การทำงานกับ std::cerr และ std::clog
← กลับไปที่ C++ Academy