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