การทำงานกับไฟล์ไบนารี
ข้อมูลทั้งหมดจะถูกเก็บไว้ในคอมพิวเตอร์ในรูปแบบ 0 และ 1 เช่น ในรูปแบบไบนารี ไฟล์ไบนารีแตกต่างจากไฟล์ข้อความเฉพาะในวิธีการทำงานกับไฟล์เหล่านั้น ตัวอย่างเช่น หากเราเขียนตัวเลข “4” ลงในไฟล์ข้อความ ไฟล์นั้นจะถูกเขียนเป็นอักขระ และจำเป็นต้องใช้หนึ่งไบต์ในการจัดเก็บ ดังนั้นขนาดไฟล์จะเท่ากับหนึ่งไบต์ ไฟล์ข้อความที่มีรายการ: "145687" จะมีขนาดหกไบต์
หากเราเขียนจำนวนเต็ม 145,687 ลงในไฟล์ไบนารี่ จะมีขนาด 4 ไบต์ เนื่องจากนั่นคือจำนวนที่จำเป็นในการจัดเก็บข้อมูล int นั่นคือไฟล์ไบนารี่มีขนาดกะทัดรัดกว่าและในบางกรณีก็ประมวลผลได้ง่ายกว่า
การเขียนชนิดข้อมูลมาตรฐานลงในไฟล์ไบนารี
หากต้องการเปิดไฟล์ไบนารี คุณต้องตั้งค่าโหมดการเข้าถึงเป็น ios::binary (ในคอมไพเลอร์ C++ บางตัว ios::bin)
หากต้องการสร้างไฟล์เอาต์พุต ให้สร้างอ็อบเจ็กต์:
ofstream outBinFile("out.bin", ios::out | ios::binary);
/* การสร้างวัตถุคลาสของกระแส ออก. ถังขยะ
ถ้า (! out_f ฉัน 1) //การตรวจสอบมาตรฐาน
ข้อมูลถูกเขียนโดยใช้เมธอด write() ซึ่งมีพารามิเตอร์สองตัว ตัวแรกคือตัวชี้ไปยังจุดเริ่มต้น (ที่อยู่เริ่มต้น) ของข้อมูลที่กำลังเขียน ตัวที่สองคือจำนวนไบต์ที่จะเขียน ในกรณีนี้ ตัวชี้ต้องถูกแปลงเป็นประเภทถ่านอย่างชัดเจน
ตัวอย่างที่ 1เขียนตัวแปรประเภทต่าง ๆ ลงในไฟล์ไบนารี:
ofstream outBinFile("test.bin", ios::out I
iOS: :binary) ; /^การสร้างวัตถุคลาสของกระแส และพยายามเชื่อมโยงมันเข้ากับไฟล์ทดสอบ. ถังขยะ ในโหมดการเขียนไฟล์ไบนารี */
อินท์เอ - 145687; //การประกาศตัวแปรทั้งหมดก
ออกBinFi le. เขียน ((ถ่าน*) &a, ขนาดของ (a)) ; /^เขียนลงไฟล์
ตัวแปรก เป็นกระแสข้อมูลไบต์ เช่น การเขียนลงในไฟล์เพื่อเป็นตัวแทนภายในของตัวแปรทั้งหมดก */ ลอย x - 123.25; - การประกาศตัวแปรที่แท้จริงเอ็กซ์
outBinFile .write ((อักขระ*) &x, ขนาดของ (x)); /^เขียนลงไฟล์
ตัวแปรเอ็กซ์ เป็นกระแสข้อมูลไบต์ เช่น การเขียนลงในไฟล์เพื่อเป็นตัวแทนภายในของตัวแปรทั้งหมด x*/
//คำจำกัดความของตัวแปรสัญลักษณ์กับ และเริ่มต้นด้วยสัญลักษณ์ g outBinFile.write((ถ่าน*)&c, ขนาดของ(c));
//บันทึกสัญลักษณ์ก เพื่อยื่น
outBinFile.close(); กลับ 0;
หากคุณเปิดเนื้อหาของไฟล์ทดสอบ .bin ด้วยโปรแกรมแก้ไขข้อความ มันจะมีลักษณะดังนี้:
และขนาดไฟล์จะเป็น 9 ไบต์
การอ่านชนิดข้อมูลมาตรฐานจากไฟล์ไบนารี
หากต้องการเปิดไฟล์ไบนารี่ที่มีอยู่เพื่ออ่าน คุณต้องสร้างอ็อบเจ็กต์:
ifstream inpBinFile("inp.bin", ios::in I ios::binary);
/* เราใช้การแยกแฟล็กเพื่อระบุว่าไฟล์ถูกเปิดเพื่ออ่านในรูปแบบไบนารี */
ถ้า (! inpBinFile)
coutหากต้องการอ่านข้อมูล เราใช้ฟังก์ชัน read() ซึ่งมีพารามิเตอร์คล้ายกับฟังก์ชัน write()
#include การใช้เนมสเปซมาตรฐาน; int หลัก()
ifstream inpBinFile("test.bin", ios::in I
iOS::ไบนารี่); - /เปิดไฟล์เพื่ออ่านในรูปแบบไบนารี่
อินท์เอ; ลอย x; ถ่านค = "g";
inpBinFile.read((ถ่าน*)&a, ขนาดของ(a));
// อ่านตัวแปรจำนวนเต็ม inpBinFile.read((ถ่าน*)&x, ขนาดของ(x));
//อ่านตัวแปรจริง inpBinFile.read((ถ่าน*)&c, ขนาดของ (c));
// อ่านตัวแปรสัญลักษณ์
inpBinFile.close(); ศาล
ผลลัพธ์ของโปรแกรม:
ก = 145687 x = 123.25 วิ = ก
โปรดทราบว่าไม่มีการแปลงข้อมูลเกิดขึ้นเมื่อใช้ฟังก์ชันเขียนและอ่าน การแสดงข้อมูลภายในจะถูกเขียนและอ่านจากไฟล์ นั่นคือสาเหตุที่ทั้งสองโปรแกรมก่อนหน้านี้ให้ผลลัพธ์ที่ถูกต้อง
การเขียนและการอ่านชนิดข้อมูลที่กำหนดเองไปยังไฟล์ไบนารี
ต่างจากไฟล์ข้อความ การทำงานกับประเภทข้อมูลแบบกำหนดเองโดยใช้ไฟล์ไบนารี่ก็ไม่แตกต่างจากประเภทข้อมูลมาตรฐาน เมธอด write() และ read() ใช้ในลักษณะเดียวกัน โปรแกรมเมอร์จะต้องระบุที่อยู่ของส่วนหน่วยความจำที่จะเขียนและจำนวนไบต์ที่จะเขียนเท่านั้น โดยคำนึงถึงว่าไม่มีการแปลงข้อมูลเกิดขึ้น มีเพียงการเขียนและอ่านการแสดงข้อมูลภายในเท่านั้น
นอกจากนี้ เมื่อทำงานกับไฟล์ไบนารี สามารถใช้เมธอด seekg(), tellg(), Seep(), tellp() ได้
ตัวอย่างที่ 3เขียนโปรแกรมที่เขียนข้อมูลเกี่ยวกับกลุ่มนักท่องเที่ยวเป็นไฟล์ไบนารี
fstream BinFile("ankety.bin", ios::in I ios::out | ios::binary);
อังเคต้า กรัปปา = ; สำหรับ (int i = 0; i
BinFile.write((char*)&Gruppa[i], sizeof(Anketa)); BinFile.close(); กลับ 0;
ตัวอย่างที่ 4ไฟล์ “ankety.bin” มีข้อมูลเกี่ยวกับกลุ่มนักท่องเที่ยว จำเป็นต้องอ่านและแสดงบนหน้าจอ
#include การใช้เนมสเปซมาตรฐาน; แบบสอบถามโครงสร้าง (
ชื่อถ่าน; อายุจริง;
ชนิดข้อมูลโครงสร้างแบบสอบถาม ไปที่หน้าจอ*/
ostream และตัวดำเนินการ
fstream BinFile("ankety.bin", ios::in | ios::out | ios::binary); ถ้า (!BinFile)
สำหรับ (int i = 0; i
//อ่านไบต์ทั้งหมดที่ถูกครอบครองโดยตัวแปรประเภททันที Anketa BinFile.read((char*)&Gruppa[i], sizeof(Anketa));
BinFile.close(); กลับ 0;
ผลลัพธ์ของโปรแกรม:
อิวานอฟ, 23 ซิโดรอฟ, 21 เปตรอฟ,22
หากต้องการดำเนินการต่อ ให้กดปุ่มใดก็ได้ - -
การพัฒนาคลาสของคุณเองสำหรับการทำงานกับไฟล์
ไม่สะดวกที่จะใช้วิธีการเขียน () และอ่าน () อย่างต่อเนื่อง การใช้การดำเนินการ ">" โดยการเปรียบเทียบกับไฟล์ข้อความจะสะดวกกว่ามาก เรามายกตัวอย่างการใช้คลาสของเราเพื่อทำงานกับไฟล์ไบนารี่
ใช้เนมสเปซมาตรฐาน;
แบบสอบถามโครงสร้าง //ประกาศโครงสร้างการจัดเก็บข้อมูล
/*โอเวอร์โหลดการดำเนินการแทรกลงในสตรีมสำหรับเอาต์พุตแบบกำหนดเอง
ชนิดข้อมูลโครงสร้างแบบสอบถาม ไปที่หน้าจอ*/
ostream และตัวดำเนินการ
คลาส outBinaryFile: public ของกระแส /^กำหนดคลาสของเราสำหรับการทำงานกับไฟล์ไบนารีเอาท์พุต เราได้รับมาจากคลาสสำหรับการทำงานกับสตรีมไฟล์เอาต์พุต */
/*เมื่ออธิบายคอนสตรัคเตอร์ของคลาสที่สร้างขึ้น อย่าลืมเรียกคอนสตรัคเตอร์ของคลาสฐาน โดยส่งพารามิเตอร์ที่จำเป็น*/
outBinaryFile(ชื่อถ่าน*) : ofstream(ชื่อ, ios::out I ios::binary)
//โอเวอร์โหลดการดำเนินการที่จำเป็นเป็นวิธีการเรียน outBinaryFile& ตัวดำเนินการ
write((char*)&chislo, sizeof(chislo)); กลับ *สิ่งนี้;
outBinaryFile& ตัวดำเนินการ
เขียน((ถ่าน*)&ank, ขนาดของ(ank)); กลับ *สิ่งนี้;
คลาส inpBinaryFile: สาธารณะถ้าสตรีม /* เรากำหนดคลาสของเราสำหรับการทำงานกับไฟล์ไบนารีอินพุต เราได้รับมาจากคลาสสำหรับการทำงานกับสตรีมไฟล์อินพุต */
inpBinaryFile(ชื่อถ่าน*) : ifstream(ชื่อ, ios::in I ios::binary)
/*เรียกตัวสร้างคลาสฐานพร้อมพารามิเตอร์ที่จำเป็น
เพียงพอสำหรับคอนสตรัคเตอร์ของคลาสที่ได้รับ */
//โอเวอร์โหลดการดำเนินการที่จำเป็น
inpBinaryFile& ตัวดำเนินการ >> (int & หมายเลข)
อ่าน((ถ่าน*)&chislo, ขนาดของ(chislo)); กลับ *สิ่งนี้;
inpBinaryFile& ตัวดำเนินการ >> (Anketa& ank)
อ่าน((ถ่าน*)&ank, ขนาดของ(ank)); กลับ *สิ่งนี้;
int ก = 111, b = 112; outBinaryFile outFile("dannye.bin");
//เปิดไฟล์เพื่ออ่าน
inpBinaryFile inpFile("dannye.bin"); ถ้า (!inpFile)
สำหรับ (int i = 0; i
inpFile >> ก; //อ่านโปรไฟล์จากไฟล์
cout // และแสดงมันบนหน้าจอ
inpFile >> แบบสอบถาม; ศาล
ผลลัพธ์ของโปรแกรม:
โคลยา 1990, 582-78-95.
หากต้องการดำเนินการต่อ ให้กดปุ่มใดก็ได้ - -
1. สามารถใช้การดำเนินการในโปรแกรมได้หรือไม่?
ios::ใน และ ios::ออก
- ก) ใช่ ไม่ว่าในกรณีใด
- b) ใช่ แต่เมื่อทำงานกับไฟล์ข้อความเท่านั้น
- c) ไม่ ไม่ว่าในกรณีใด
- 2. ระบุตัวเลือกที่ถูกต้องสำหรับการเปิดไฟล์ข้อความสำหรับการอ่าน:
- ก) ifstream inpF("input.txt", ios::in);
- b) ifstream inpF("input.txt", ios::input);
- ค) ifstream inpF(ios:in, "input.txt")
H. สิ่งที่จะปรากฏบนหน้าจออันเป็นผลมาจากการรันโค้ดต่อไปนี้?
inputFile.get(c);
ถัดไป - inputFile.peek();
ถ้า (ถัดไป == EOF)
- ก) เนื้อหาของไฟล์ที่เกี่ยวข้องกับสตรีม inputFile จะปรากฏบนหน้าจอหนึ่งครั้ง
- b) เนื้อหาของไฟล์ที่เกี่ยวข้องกับสตรีม inputFile จะปรากฏบนหน้าจอเป็นจำนวนไม่สิ้นสุด;
- c) ไม่มีสิ่งใดปรากฏบนหน้าจอ
- 4. ในไฟล์มีอักขระกี่ตัว?
- 12 3 4 5 6
- ก) 6;
- ข) 7;
- ค) 11.
- 5. วิธีใดที่ช่วยให้คุณระบุจุดสิ้นสุดของไฟล์ได้?
- ก) อีฟ();
- ข) ดี();
- c) ทั้งสองวิธีนี้
- 6. ฟังก์ชัน getline() มีไว้เพื่ออะไร?
- ก) อ่านคำจากไฟล์
- b) อ่านเนื้อหาทั้งหมดของไฟล์
- c) อ่านบรรทัดจากไฟล์
- 7. หากต้องการเขียน/อ่านประเภทข้อมูลที่กำหนดเองลงในไฟล์ คุณต้อง:
- ก) โอเวอร์โหลดการดำเนินการ ">>" และ "
- b) ประเภทข้อมูลการเขียนและการอ่านที่กำหนดเองสามารถใช้ได้โดยไม่ต้องดำเนินการเพิ่มเติม
- c) การเขียนและการอ่านประเภทข้อมูลที่กำหนดเองลงในไฟล์เป็นไปไม่ได้
- 8. ฟังก์ชันใดที่ใช้เขียน/อ่านข้อมูลในรูปแบบไบนารี่?
- ก) printf / scanf;
- ข) เขียน / อ่าน;
- c) ใส่ / รับ
- 1. เขียนโปรแกรมที่เขียนตัวอักษรภาษาอังกฤษลงในไฟล์
- 2. ไฟล์ input.txt มีข้อมูลจากบรรทัดข้อความหลายบรรทัด แสดงเนื้อหาของไฟล์นี้บนหน้าจอ นับจำนวนบรรทัดในไฟล์
- 3. ดิสก์มีไฟล์ result.txt พร้อมผลการทดลองทางเคมี เขียนโปรแกรมที่สร้างสำเนาของไฟล์ชื่อ copy_resylt.txt
- 4. ป้อนชื่อไฟล์โดยใช้แป้นพิมพ์ ลบบรรทัดคู่ทั้งหมดในไฟล์ที่ระบุ
- 5. เขียนโปรแกรมที่แทนที่อักษรตัวพิมพ์เล็กทั้งหมดด้วยตัวพิมพ์ใหญ่ในไฟล์ข้อความ และในทางกลับกัน
- 6. ไฟล์ข้อความต้นฉบับประกอบด้วยตัวเลขที่คั่นด้วยช่องว่าง สร้างไฟล์ใหม่สองไฟล์: ไฟล์แรกควรมีเพียงตัวเลขคู่และไฟล์ที่สอง - คี่
- 7. ไฟล์นี้มีตัวเลขจริง เขียนโปรแกรมโดยละเศษส่วนของตัวเลขเหล่านี้ออกแล้วเขียนลงในไฟล์ใหม่
- 8. ไฟล์ข้อความประกอบด้วยข้อมูลเกี่ยวกับเที่ยวบินของสายการบิน เลือกเที่ยวบินที่ออกเดินทางช่วงบ่ายจากข้อมูลนี้และแสดงบนหน้าจอ
- 9. โอเวอร์โหลด >> และโอเปอเรเตอร์
- 10. เขียนชั้นเรียนของคุณเองเพื่อทำงานกับไฟล์ไบนารี
- 11. เขียนรายชื่อนักเรียน 10 คนในชั้นเรียนลงในไฟล์ข้อความและลงในไฟล์ไบนารี เปรียบเทียบไฟล์เหล่านี้ อธิบายความแตกต่างที่เกิดขึ้น
- 12. พัฒนาคลาสที่เขียนข้อมูลเกี่ยวกับรถยนต์ (ปีที่ผลิต ยี่ห้อ สี ฯลฯ) ลงในไฟล์ข้อความ ในกรณีนี้ สัญลักษณ์ข้อมูลแต่ละรายการจะถูกแทนที่ด้วยรหัส ABO 1 ของตัวเอง แสดงไฟล์ผลลัพธ์บนหน้าจอ
คำถามเพื่อความปลอดภัย
- 1. คลาสใดที่ใช้ในการทำงานกับสตรีมไฟล์?
- 2. สามารถใช้โหมดการเข้าถึงใดเมื่อทำงานกับไฟล์? ยกตัวอย่าง.
- 3. ใช้วิธีใดในการเปิดไฟล์? ยกตัวอย่าง.
- 4. มีการดำเนินการใดบ้างสำหรับการทำงานกับไฟล์? มีฟังก์ชันอะไรบ้างในการดำเนินการเหล่านี้?
- 5. วิธีใดที่อนุญาตให้คุณระบุจุดสิ้นสุดของไฟล์เมื่ออ่านข้อมูลจากไฟล์นั้น? ความแตกต่างระหว่างวิธีการเหล่านี้คืออะไร? ยกตัวอย่าง.
- 6. คุณจะอ่านตัวแปรของประเภทข้อมูลมาตรฐานจากไฟล์ข้อความได้อย่างไร?
- 7. เป็นไปได้ไหมที่จะอ่านตัวแปรประเภทข้อมูลที่กำหนดเองจากไฟล์ข้อความ?
- 8. ฟังก์ชั่นใดบ้างที่ได้รับการออกแบบมาเพื่อสุ่มอ่านข้อมูลจากไฟล์? ยกตัวอย่าง.
- 9. ตั้งชื่อคุณสมบัติของไฟล์ไบนารี ข้อดีของการใช้ไฟล์ดังกล่าวคืออะไร?
- 10. ฟังก์ชันใดที่สามารถใช้เพื่อเขียน/อ่านข้อมูลลงในไฟล์ไบนารี่ได้?
- 11. จะอ่านตัวแปรประเภทข้อมูลมาตรฐานจากไฟล์ไบนารี่ได้อย่างไร?
- 12. ข้อควรพิจารณาใดบ้างที่ต้องนำมาพิจารณาเมื่ออ่านประเภทข้อมูลที่กำหนดเองจากไฟล์ไบนารี?
- "อีวานอฟ", 23), ("ซิโดรอฟ", 21),
ไฟล์ไบนารีคือไฟล์ใดๆ ในคอมพิวเตอร์ของคุณ ข้อมูลทั้งหมดบนคอมพิวเตอร์และสื่อที่เกี่ยวข้องจะถูกบันทึกเป็นบิต (จึงเป็นที่มาของชื่อ) อย่างไรก็ตามสำหรับการเปรียบเทียบ ไฟล์ข้อความสามารถอ่านได้ในโปรแกรมอ่านที่เกี่ยวข้องกับส่วนขยาย (ไฟล์ที่ง่ายที่สุด - แม้ใน Notepad) แต่ไฟล์ปฏิบัติการไม่สามารถทำได้ และแม้ว่าในความเป็นจริงแล้วไฟล์ txt จะเป็นไฟล์ไบนารี่เดียวกัน แต่เมื่อพูดถึงปัญหาในการเปิดเนื้อหาของไฟล์ไบนารี่ พวกเขาหมายถึงไฟล์ที่ปฏิบัติการได้ตลอดจนข้อมูลที่บีบอัด
คุณจะต้อง
- - โปรแกรมแก้ไข Hex
คำแนะนำ
คำอธิบายและการนำเสนอไฟล์ภายใน
ไฟล์จะแตกต่างกัน ไฟล์ทั้งหมดที่จัดเก็บไว้ในคอมพิวเตอร์มีคุณสมบัติพิเศษ เช่น วิธีการอธิบายพิเศษที่อนุญาตให้คุณแยกแยะไฟล์หนึ่งจากอีกไฟล์หนึ่ง: 1) ชื่อ; 2)ขนาด; 3) วันที่และเวลา 4)ไอคอน
แต่ละไฟล์มีชื่อ-ชื่อไฟล์ ชื่อไฟล์อธิบายเนื้อหาหรือแนะนำสิ่งที่อาจนำไปใช้ ชื่อถูกกำหนดให้กับไฟล์เมื่อถูกสร้างขึ้น สิ่งนี้ใช้ได้กับไฟล์ทั้งหมด
แต่ละไฟล์มีขนาดทางกายภาพ ไฟล์นี้ใช้หน่วยความจำคอมพิวเตอร์และพื้นที่ดิสก์บางส่วน
เมื่อไฟล์ถูกสร้างขึ้น ระบบปฏิบัติการจะประทับตราไว้เพื่อระบุวันที่และเวลาที่สร้าง สิ่งนี้ทำให้คุณสามารถจัดเรียงไฟล์ตามวันที่และเวลาและทำให้คอมพิวเตอร์ของคุณเป็นระเบียบ วันที่และเวลาที่ไฟล์ได้รับการอัปเดตหรือแก้ไขจะถูกบันทึกไว้ด้วย
แต่ละไฟล์เป็นประเภทเฉพาะ ซึ่งเกี่ยวข้องอย่างใกล้ชิดกับไอคอนไฟล์ที่เราเห็น ประเภทไฟล์ขึ้นอยู่กับเนื้อหา แต่ละโปรแกรมจะกำหนดประเภทเฉพาะและไอคอนที่เกี่ยวข้องกับเอกสารที่สร้างขึ้น
ขนาดไฟล์วัดเป็นไบต์ เช่นเดียวกับความจุของหน่วยความจำ
ขนาดไฟล์อาจเป็น 0 ไบต์ ซึ่งหมายความว่ามีไฟล์อยู่แต่ไม่มีอะไรเลย S ขนาดไฟล์สูงสุดคือ 4 GB แต่ไฟล์ขนาดใหญ่เช่นนี้หายากมาก
จำเป็นต้องมีนาฬิกาในตัวของคอมพิวเตอร์เพื่อกำหนดเวลาและวันที่สร้างไฟล์ สิ่งนี้จะอธิบายว่าการตั้งนาฬิกานี้ให้ถูกต้องมีความสำคัญเพียงใด นอกจากนี้ยังมีแอตทริบิวต์เพิ่มเติมเพื่ออธิบายไฟล์ เช่น ไฟล์ระบบ ไฟล์ที่ซ่อน ไฟล์แบบอ่านอย่างเดียว ไฟล์เก็บถาวร ฯลฯ ระบบปฏิบัติการจะจัดการกับสิ่งนี้เอง
แต่ละไฟล์มีดัชนีที่ไม่ซ้ำกัน ดัชนีประกอบด้วยข้อมูลที่จำเป็นสำหรับกระบวนการใดๆ ในการเข้าถึงไฟล์ ประมวลผลไฟล์เข้าถึงโดยใช้ชุดการเรียกของระบบที่กำหนดไว้อย่างดี และระบุไฟล์ด้วยสตริงอักขระที่ทำหน้าที่เป็นชื่อไฟล์ที่ผ่านการรับรอง ชื่อสารประกอบแต่ละชื่อจะระบุไฟล์โดยไม่ซ้ำกัน ทำให้เคอร์เนลแปลงชื่อเป็นดัชนีไฟล์ ดัชนีประกอบด้วยตารางที่อยู่ซึ่งข้อมูลไฟล์อยู่บนดิสก์ เนื่องจากแต่ละบล็อกบนดิสก์ถูกกำหนดแอดเดรสด้วยหมายเลขของตัวเอง ตารางนี้จึงจัดเก็บคอลเลกชันของหมายเลขบล็อกดิสก์ เพื่อเพิ่มความยืดหยุ่น เคอร์เนลจะต่อท้ายไฟล์ทีละบล็อก เพื่อให้ข้อมูลของไฟล์กระจัดกระจายทั่วทั้งระบบไฟล์ แต่เลย์เอาต์นี้ทำให้การค้นหาข้อมูลซับซ้อนขึ้น ตารางที่อยู่ประกอบด้วยรายการหมายเลขบล็อกที่มีข้อมูลของไฟล์ แต่การคำนวณอย่างง่ายแสดงให้เห็นว่ารายการเชิงเส้นของบล็อกไฟล์ในดัชนีนั้นยากต่อการจัดการ เพื่อให้แน่ใจว่าโครงสร้างดัชนีขนาดเล็กช่วยให้ทำงานกับไฟล์ขนาดใหญ่ได้ ตารางที่อยู่ของบล็อกดิสก์จึงถูกนำมาสอดคล้องกับโครงสร้าง
ไฟล์ข้อความและไบนารี
ไฟล์อนุญาตให้ผู้ใช้สามารถอ่านข้อมูลจำนวนมากได้โดยตรงจากดิสก์โดยไม่ต้องป้อนข้อมูลจากแป้นพิมพ์ ไฟล์มีสองประเภทหลัก: ข้อความและไบนารี
ข้อความไฟล์ที่ประกอบด้วยอักขระใดๆ จะถูกเรียก เรียงกันเป็นแถว แต่ละแถวลงท้ายด้วย " ปลายสาย". ส่วนท้ายของไฟล์จะมีสัญลักษณ์กำกับอยู่ " จุดสิ้นสุดของไฟล์"- เมื่อเขียนข้อมูลลงในไฟล์ข้อความ ซึ่งสามารถดูได้โดยใช้โปรแกรมแก้ไขข้อความ ข้อมูลทั้งหมดจะถูกแปลงเป็นประเภทอักขระและจัดเก็บในรูปแบบอักขระ
ในไบนารี่ เอ็กซ์ไฟล์ข้อมูลถูกอ่านและเขียนในรูปแบบของบล็อกขนาดที่กำหนดซึ่งสามารถจัดเก็บข้อมูลประเภทและโครงสร้างใดก็ได้
หากต้องการทำงานกับไฟล์ชนิดข้อมูลพิเศษที่เรียกว่า ลำธารสตรีม ifstream ใช้เพื่อทำงานกับไฟล์ในโหมดอ่าน และ ifstream ถูกใช้ในโหมดเขียน ในการทำงานกับไฟล์ทั้งในโหมดการเขียนและการอ่าน จะใช้สตรีม ifstream
ในโปรแกรม C++ เมื่อทำงานกับไฟล์ข้อความ คุณต้องรวมไลบรารี ifstream และ iostream ไว้ด้วย
ในการเขียนข้อมูลลงในไฟล์ข้อความ คุณต้อง: 1) อธิบายตัวแปรประเภท ของกระแส เปิด- 3) ข้อมูลส่งออกไปยังไฟล์; 4) อย่าลืมปิดไฟล์
หากต้องการอ่านข้อมูลจากไฟล์ข้อความ คุณต้อง:
1) อธิบายตัวแปรประเภท ถ้าสตรีม- 2) เปิดไฟล์โดยใช้ฟังก์ชัน เปิด- 3) อ่านข้อมูลจากไฟล์ เมื่ออ่านข้อมูลแต่ละชิ้นจำเป็นต้องตรวจสอบว่าถึงจุดสิ้นสุดของไฟล์แล้วหรือไม่ 4) ปิดไฟล์
ควรสังเกตว่าในตัวอย่างทั้งหมดที่กล่าวถึงข้างต้น ฟังก์ชัน fopen() ในโหมด “r” และ “w” จะเปิดไฟล์ข้อความสำหรับการอ่านและการเขียนตามลำดับ ซึ่งหมายความว่าอักขระการจัดรูปแบบข้อความบางตัว เช่น อักขระขึ้นบรรทัดใหม่ '\r' ไม่สามารถอ่านเป็นอักขระแยกกันได้ อาจไม่มีอยู่ในไฟล์ แต่มีอยู่ นี่คือคุณสมบัติของโหมดข้อความของไฟล์ ในการทำงานกับเนื้อหาไฟล์ที่ "ละเอียด" ยิ่งขึ้น มีโหมดไบนารี่ที่แสดงเนื้อหาไฟล์เป็นลำดับไบต์ โดยที่โค้ดควบคุมที่เป็นไปได้ทั้งหมดเป็นเพียงตัวเลข ในโหมดนี้คุณสามารถลบหรือเพิ่มอักขระควบคุมที่ไม่สามารถใช้งานได้ในโหมดข้อความได้ เพื่อเปิดไฟล์ในโหมดไบนารี่ ฟังก์ชัน fopen() ยังใช้กับพารามิเตอร์สุดท้ายเท่ากับ "rb" และ "wb" ตามลำดับสำหรับการอ่านและการเขียน
ไฟล์. นอกจากนี้ จากมุมมองของการใช้งานทางเทคนิคในระดับฮาร์ดแวร์ ไฟล์ข้อความเป็นกรณีพิเศษของไฟล์ไบนารี่ และด้วยเหตุนี้ ในความหมายกว้างๆ ไฟล์ใดๆ ก็ตามจึงเข้าข่ายคำจำกัดความของ "ไฟล์ไบนารี"
โดยทั่วไป คำนี้แสดงถึงการวัดความสัมพันธ์ระหว่างผู้ใช้ไฟล์ไบนารี่และตัวไฟล์เอง หากผู้บริโภคทราบโครงสร้างและกฎเกณฑ์ที่เขาสามารถแปลงไฟล์ที่กำหนดให้เป็นไฟล์ระดับที่สูงกว่าได้ ก็แสดงว่าไฟล์นั้นไม่ใช่ไบนารี่สำหรับเขา ตัวอย่างเช่น ไฟล์ปฏิบัติการเป็นไบนารี่สำหรับผู้ใช้คอมพิวเตอร์ แต่ไม่ใช่ไบนารี่สำหรับระบบปฏิบัติการ - ]
การแสดงภาพ
ในการแสดงไฟล์ไบนารี่ด้วยสายตา ไฟล์จะถูกแบ่งออกเป็นชิ้นที่มีขนาดเท่ากัน แสดงเป็นตัวเลข มักจะเขียนเป็นเลขฐานสิบหก บางครั้งอยู่ในรูปฐานแปด ไบนารี่ หรือทศนิยม ขนาดชิ้นที่ระบุสามารถเท่ากับหนึ่งออคเต็ต เช่นเดียวกับสองหรือสี่ชิ้น (ในกรณีที่แยกออกเป็นส่วนๆ ของออคเต็ตหลายชิ้น ลำดับไบต์ที่นำมาใช้บนแพลตฟอร์มที่ใช้จะถูกนำมาใช้) การพึ่งพาช่วงของตัวเลขที่แสดงกับขนาดของชิ้นส่วนแสดงอยู่ในตาราง:
ออคเต็ต | จำนวนบิต | เลขฐานสิบหก | ฐานแปด | ทศนิยม ไม่ได้ลงนาม |
ทศนิยม สัญลักษณ์ |
---|---|---|---|---|---|
1 | 8 | 00 … เอฟเอฟ |
000 … 377 |
0 … 255 |
-128 … 127 |
2 | 16 | 0000 … FFFF |
000000 … 177777 |
0 … 65535 |
-32768 … 32767 |
4 | 32 | 00000000 … ฟฟฟฟฟฟ |
00000000000 … 37777777777 |
0 … 4294967295 |
-2147483648 … 2147483647 |
บ่อยครั้ง นอกจากค่าไบต์ตัวเลขแล้ว อักขระโค้ดเพจ เช่น ASCII ก็ยังถูกส่งออกด้วยเช่นกัน ตัวอย่างต่อไปนี้แสดงให้เห็นสิ่งที่เรียกว่า การถ่ายโอนข้อมูลแบบคลาสสิก(การแสดงเลขฐานสิบหก octet-by-octet ขนาด 16 ไบต์ต่อบรรทัด โดยมีอักขระ ASCII ที่พิมพ์ได้ทางด้านขวา) ของจุดเริ่มต้นของไฟล์ PNG ของโลโก้ Wikipedia:
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 | ..... gAMA ..... OX | 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e. Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 | dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000a0 27 27 27 1a 1a 1a 38 38 38 2a 2a 2a 08 08 08 20 |"""...888**... | 000000b0 20 20 17 17 17 2e 2e 2e 13 13 13 bb bb bb 88 88 | . ............|
เครื่องมือ
สำหรับการมองเห็น
- แก้ไขข้อบกพร่อง (บน Microsoft Windows บางส่วน)
- hexdump (บน FreeBSD, GNU/Linux ฯลฯ)
สำหรับการแก้ไข
- โปรแกรมแก้ไข HEX
- beye (สำหรับระบบปฏิบัติการทั้งหมด, ซอฟต์แวร์ฟรี)
- สวัสดี (สำหรับ DOS, Microsoft Windows, Windows NT)
- WinHex (สำหรับวินโดวส์)
คุณอาจเจอคำว่า "ข้อความ" และ "ไบนารี" อยู่แล้วในขณะที่อ่านบทความเกี่ยวกับ และพวกเขาตัดสินใจว่าทั้งหมดนี้ซับซ้อนเกินไปสำหรับคุณ จนไม่มีทางที่จะเข้าใจได้ ดังนั้นพวกเขาจึงไม่เจาะลึกและยอมแพ้
เราจะพยายามอธิบายทุกอย่างด้วยเงื่อนไขที่ง่ายที่สุดเท่าที่จะเป็นไปได้ เนื่องจากข้อมูลดังกล่าวมีประโยชน์สำหรับผู้ใช้ทุกคน แม้แต่ผู้ที่ไม่มีประสบการณ์มากที่สุด เนื่องจากเกี่ยวข้องโดยตรงกับพื้นฐานของความปลอดภัยของคอมพิวเตอร์
ทฤษฎีเล็กน้อย
ไฟล์ข้อความประกอบด้วยอักขระ ASCII (ตัวย่อย่อมาจาก American Standard Code for Information Interchange หรือบางอย่างเช่น "American Standard Code for Information Interchange")
ในความเป็นจริง ASCII เป็นตารางที่แต่ละตัวอักษร ตัวเลข เครื่องหมายวรรคตอน และ "สุนัข" ต่างๆ ที่มี "เกล็ดหิมะ" (ในความหมายของ @ และ *) ได้รับการจัดสรรหนึ่งไบต์ นั่นคือศูนย์แปดตัวและหนึ่ง (บิต) นอกจากนี้ แน่นอนว่าควบคุมตัวละครอย่างขึ้นบรรทัดใหม่ได้ด้วย
โปรแกรมสำหรับเปิดไฟล์ที่มีอักขระ ASCII จะแปลงไบต์เป็นตัวอักษร ตัวเลข และอักขระอื่นๆ ที่สามารถพิมพ์ได้บนจอแสดงผล แน่นอนว่าซอฟต์แวร์จะต้องเข้าใจส่วนหนึ่งของตารางที่สอดคล้องกับภาษารัสเซีย แต่นี่เป็นเรื่องของการเข้ารหัสอยู่แล้ว
ในไฟล์ไบนารี่ ค่าศูนย์และค่าต่างๆ จะถูกจัดเรียงตามลำดับซึ่งไม่จำเป็นสำหรับการแสดงข้อความ (แม้ว่าจะมีบางค่า เช่น *doc) ทำไมคุณถาม คำตอบนั้นง่าย: สำหรับสิ่งอื่นทั้งหมด โปรแกรม ภาพยนตร์ เพลง รูปภาพ - แต่ละรูปแบบมีหลักการโครงสร้างของตัวเองในการจัดระเบียบข้อมูล
คำว่า "ไบนารี" นั้นหมายถึง "ประกอบด้วยสององค์ประกอบ" "สองเท่า" อันที่จริงมีความเป็นไปได้ที่จะกำหนดองค์ประกอบเพียงสองส่วนอย่างชัดเจน - ศูนย์และหนึ่งบิต "อิฐ" ซึ่งประกอบด้วยไฟล์ ความหมายของทุกสิ่งทุกอย่างสามารถปรากฏได้เฉพาะในระหว่างการเริ่มต้นเท่านั้น (การเปิด, การเล่น)
ด้านที่ผิดของโลกดิจิทัล
คุณสามารถดูภายในไฟล์ไบนารี่ได้โดยใช้โปรแกรมพิเศษ - โปรแกรมแก้ไข HEX (จากคำว่าเลขฐานสิบหก ซึ่งหมายถึงระบบเลขฐานสิบหก) ซอฟต์แวร์ดังกล่าวจะแสดงไบต์ในรูปแบบของการกำหนด HEX ซึ่งจริงๆ แล้วจะอยู่ในรูปแบบของตาราง (เมทริกซ์) ด้วย
ตัวอย่างเช่น ไบต์ของรูปภาพในรูปแบบ JPEG รูปภาพหรือภาพถ่ายปกติ จะแสดงในหน้าต่างตัวแก้ไขเป็น FF D8 FF 00 04 3A 29 เป็นต้น
ผู้เชี่ยวชาญจะเข้าใจว่าลำดับของไบต์ FF D8 ที่จุดเริ่มต้นบ่งชี้ว่านี่คือ JPEG แต่ทั้งหมดนี้ไม่น่าสนใจสำหรับผู้ที่ไม่ใช่ผู้เชี่ยวชาญ
คุณยังสามารถเปิดไฟล์ข้อความในตัวแก้ไข HEX เพื่อดูว่าไบต์ใดตรงกับตัวอักษรเฉพาะ (อักขระ ASCII) แต่ด้วยความอยากรู้เท่านั้นจึงยังไม่มีประเด็นในนั้น
แต่บางครั้งไฟล์ไบนารี่จะถูกดูในรูปแบบเลขฐานสิบหกเพื่อวัตถุประสงค์ที่มีความหมายและเฉพาะเจาะจง ตัวอย่างเช่น ผู้เชี่ยวชาญด้านห้องปฏิบัติการป้องกันไวรัสจะมองหาโค้ดที่เป็นอันตรายที่เพิ่มเข้าไปในโค้ดหลักในลักษณะนี้ ยังไงก็ตาม เรามาดูประเด็นด้านความปลอดภัยกันดีกว่า
สิ่งที่สามารถทำร้ายได้
ไฟล์ข้อความไม่สามารถมีสิ่งอื่นใดนอกจากอักขระ ASCII อย่างไรก็ตาม โปรแกรมไม่ได้เป็นเพียงไบนารี่เท่านั้น แต่ยังประกอบด้วยสัญลักษณ์ข้างต้นด้วย ฉันหมายถึงสคริปต์แน่นอน
กล่าวอีกนัยหนึ่ง ไฟล์ *txt ไม่ได้ติดไวรัสโดยหลักการ และไม่ก่อให้เกิดภัยคุกคาม และหากมีสคริปต์อยู่ในไฟล์ข้อความก็อาจทำให้เกิดปัญหาได้มากมาย
ตัวอย่างเช่น ไฟล์ *bat มีโค้ดของคำสั่งต่างๆ และเปิดขึ้นโดยการดับเบิลคลิก เช่นเดียวกับโปรแกรมทั่วไป คำสั่งเหล่านั้นเขียนด้วยอักขระ ASCII แต่ระบบปฏิบัติการรู้วิธีการตีความคำสั่งเหล่านั้น - เปลี่ยนให้เป็นศูนย์และเป็นคำสั่งทั่วไปสำหรับโปรแกรม
แต่แน่นอนว่าคุณไม่คลิกไฟล์ค้างคาวที่ไม่รู้จักใช่ไหม ดีแล้ว.
สิ่งพิมพ์ก่อนหน้า:
แก้ไขครั้งสุดท้าย: 2012-11-06 14:45:16 น
แท็กวัสดุ: ,