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

อินพุต/เอาต์พุตไฟล์ไบนารี

อ่านและเขียนไบต์ดิบ

บทเรียน 3 จาก 413 ขั้นตอน

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

ข้อความเทียบกับไบนารี

โหมดข้อความจะเขียนอักขระที่มนุษย์อ่านได้ ส่วนโหมดไบนารีจะเขียนไบต์ดิบของออบเจ็กต์ตามที่อยู่ในหน่วยความจำทุกประการ ให้เปิดด้วย std::ios::binary

#include <iostream>
#include <fstream>

int main() {
    int value = 12345;
    std::ofstream out("v.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(&value), sizeof(value));
    std::cout << "wrote " << sizeof(value) << " bytes\n";
    return 0;
}

write รับไบต์

write(ptr, n) ส่งออกไบต์ดิบจำนวน n ไบต์จาก ptr คุณต้องแปลงชนิดที่อยู่ของออบเจ็กต์เป็น const char*

#include <iostream>
#include <fstream>

int main() {
    double d = 3.14;
    std::ofstream out("d.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(&d), sizeof(d));
    out.close();
    std::cout << "saved a double\n";
    return 0;
}

read กู้คืนไบต์

read(ptr, n) โหลดไบต์จำนวน n ไบต์ลงในออบเจ็กต์ที่ ptr ซึ่งเป็นการย้อนกลับการเขียนแบบไบนารี

#include <iostream>
#include <fstream>

int main() {
    int original = 777;
    std::ofstream("i.bin", std::ios::binary).write(reinterpret_cast<const char*>(&original), sizeof(original));
    int loaded = 0;
    std::ifstream in("i.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(&loaded), sizeof(loaded));
    std::cout << loaded << '\n';
    return 0;
}

การเขียนโครงสร้าง POD

โครงสร้างข้อมูลแบบธรรมดา (ไม่มีตัวชี้และมีสมาชิกขนาดคงที่) สามารถถ่ายโอนและโหลดกลับเป็นกลุ่มไบต์เดียวได้

#include <iostream>
#include <fstream>

struct Record { int id; double balance; };

int main() {
    Record r{1, 99.5};
    std::ofstream out("rec.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(&r), sizeof(r));
    std::cout << "struct saved\n";
    return 0;
}

การอ่านโครงสร้างกลับ

การอ่านจะกู้คืนโครงสร้างทั้งหมดได้ด้วยการเรียก read เพียงครั้งเดียว

#include <iostream>
#include <fstream>

struct Record { int id; double balance; };

int main() {
    Record w{42, 250.0};
    std::ofstream("r2.bin", std::ios::binary).write(reinterpret_cast<const char*>(&w), sizeof(w));
    Record r{};
    std::ifstream in("r2.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(&r), sizeof(r));
    std::cout << r.id << ' ' << r.balance << '\n';
    return 0;
}

การเขียนอาร์เรย์

คุณสามารถเขียนอาร์เรย์ทั้งหมดได้ด้วยการเรียกเพียงครั้งเดียว โดยส่งขนาดรวมของไบต์ไป

#include <iostream>
#include <fstream>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    std::ofstream out("arr.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(arr), sizeof(arr));
    std::cout << "wrote " << sizeof(arr) << " bytes\n";
    return 0;
}

การอ่านอาร์เรย์กลับ

อ่านไบต์จำนวนเท่าเดิมลงในอาร์เรย์ที่มีขนาดเท่าเดิม

#include <iostream>
#include <fstream>

int main() {
    int src[5] = {10, 20, 30, 40, 50};
    std::ofstream("a2.bin", std::ios::binary).write(reinterpret_cast<const char*>(src), sizeof(src));
    int dst[5] = {};
    std::ifstream in("a2.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(dst), sizeof(dst));
    for (int x : dst) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

การเลื่อนตำแหน่ง

seekg (รับข้อมูล) และ seekp (ส่งข้อมูล) ใช้เลื่อนตำแหน่งอ่าน/เขียน ทำให้เข้าถึงข้อมูลในไฟล์แบบสุ่มได้

#include <iostream>
#include <fstream>

int main() {
    int data[3] = {100, 200, 300};
    std::ofstream("seek.bin", std::ios::binary).write(reinterpret_cast<const char*>(data), sizeof(data));
    std::ifstream in("seek.bin", std::ios::binary);
    in.seekg(sizeof(int)); // skip to second int
    int second; in.read(reinterpret_cast<char*>(&second), sizeof(second));
    std::cout << second << '\n';
    return 0;
}

การรายงานตำแหน่ง

tellg และ tellp รายงานตำแหน่งปัจจุบัน ซึ่งมีประโยชน์สำหรับการวัดขนาดไฟล์หรือออฟเซ็ต

#include <iostream>
#include <fstream>

int main() {
    int data[4] = {1, 2, 3, 4};
    std::ofstream("tell.bin", std::ios::binary).write(reinterpret_cast<const char*>(data), sizeof(data));
    std::ifstream in("tell.bin", std::ios::binary);
    in.seekg(0, std::ios::end);
    std::cout << "file size: " << in.tellg() << " bytes\n";
    return 0;
}

เหตุใดจึงไม่ใช้ตัวชี้

อย่าถ่ายโอนออบเจ็กต์ที่มีตัวชี้หรือ std::string เป็นไบนารีโดยตรง เพราะคุณจะบันทึกที่อยู่ของตัวชี้ ไม่ใช่ข้อมูลที่ตัวชี้นั้นชี้อยู่ ให้ทำการแปลงเนื้อหาเป็นข้อมูลอนุกรมแทน

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::string s = "hello";
    std::ofstream out("str.bin", std::ios::binary);
    std::size_t len = s.size();
    out.write(reinterpret_cast<const char*>(&len), sizeof(len));
    out.write(s.data(), len); // write the chars, not the object
    std::cout << "serialized " << len << " chars\n";
    return 0;
}

ข้อควรระวังด้านการพกพา

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

#include <iostream>
#include <cstdint>

int main() {
    std::int32_t fixed = 1; // fixed-width type for portability
    std::cout << "sizeof int32_t = " << sizeof(fixed) << '\n';
    return 0;
}

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

ทดสอบความเข้าใจเกี่ยวกับการรับส่งข้อมูลไบนารี

ทบทวน

คุณได้เรียนรู้การรับส่งข้อมูลไฟล์ไบนารีดังนี้:

  • เปิดด้วย std::ios::binary และใช้ write/read ร่วมกับ reinterpret_cast<char*>
  • seekg/seekp และ tellg/tellp ช่วยให้เข้าถึงข้อมูลแบบสุ่มได้
  • อย่าถ่ายโอนตัวชี้หรือสตริงโดยตรง ให้แปลงเนื้อหาเป็นข้อมูลอนุกรมแทน และระวังเรื่องลำดับไบต์

ถัดไป คุณจะได้เรียนรู้การตรวจสอบสถานะสตรีมและการจัดการข้อผิดพลาด

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “อินพุต/เอาต์พุตไฟล์ไบนารี” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “อินพุต/เอาต์พุตไฟล์ไบนารี”

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

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

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

บทเรียน “อินพุต/เอาต์พุตไฟล์ไบนารี” ใช้เวลานานแค่ไหน

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

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

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

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

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