ไวยากรณ์และพารามิเตอร์ของฟังก์ชัน Seekg() ในภาษา C++
Seekg() สามารถนำไปใช้ได้ด้วยสองไวยากรณ์:
1. ไวยากรณ์ Streampos
ลำธาร - แสวงหา - โพสต์สตรีมโพส - -ไวยากรณ์นี้รับเพียงหนึ่งพารามิเตอร์ ตำแหน่ง ซึ่งแสดงถึงตำแหน่งของเคอร์เซอร์ในบัฟเฟอร์สตรีม มันแสดงถึงค่า “int” และประเภท streampos
2. ไวยากรณ์ออฟเซ็ตและทิศทาง
ลำธาร - แสวงหา - สตรีมออกบ่อยครั้ง - ios_base - แสวงหาคือ สิ่งสกปรก - -ไวยากรณ์นี้รับพารามิเตอร์สองตัวเป็นอินพุต: ออฟเซ็ตและทิศทาง พารามิเตอร์ “ofst” เป็นจำนวนเต็มประเภท streamoff ที่ระบุออฟเซ็ตในบัฟเฟอร์ของสตรีม พารามิเตอร์ 'สิ่งสกปรก' ค้นหาทิศทาง
- ios_base::beg: ชดเชยจากจุดเริ่มต้นของบัฟเฟอร์ของสตรีม
- ios_base::cur: ออฟเซ็ตจากตำแหน่งปัจจุบันในบัฟเฟอร์ของสตรีม
- ios_base::end: ชดเชยจากบัฟเฟอร์สุดท้ายของสตรีม
ฟังก์ชัน seekg() ในภาษา C++ จัดการตัวชี้ไฟล์ ทำให้โปรแกรมเมอร์สามารถวางตำแหน่งไว้ที่ตำแหน่งเฉพาะภายในไฟล์ได้ มันจะส่งคืนการแก้ไขของวัตถุ “istream” (*สิ่งนี้) และปรับตัวชี้ไฟล์ตามนั้น
การจัดการข้อผิดพลาดและข้อยกเว้นในฟังก์ชัน C ++ Seekg ()
ฟังก์ชัน seekg() ในภาษา C++ ช่วยให้มั่นใจได้ถึงการรับประกันขั้นพื้นฐานสำหรับการจัดการข้อยกเว้น โดยคงไว้ซึ่งความถูกต้องของวัตถุหากมีข้อยกเว้นเกิดขึ้น มันอาจจะโยนข้อยกเว้น “ความล้มเหลว” เมื่อสถานะสถานะข้อผิดพลาดขาดข้อมูล และฟังก์ชันจะจับและจัดการข้อยกเว้นเหล่านี้อย่างมีความรับผิดชอบ โดยจะทำการโยนใหม่หากมีการตั้งค่าบิตที่ไม่ถูกต้องในการเรียกครั้งล่าสุด
นอกจากนี้ ปัญหาทั่วไปของ seekg() จะเกิดขึ้นเมื่อถึงจุดสิ้นสุดไฟล์ (EOF) ส่งผลให้ตัวชี้ไม่ได้ตั้งค่าและก่อให้เกิดข้อผิดพลาด วิธีการ clear() ใช้เพื่อรีเซ็ตตัวชี้และแก้ไขข้อผิดพลาดที่เกี่ยวข้องกับ EOF เพื่อแก้ไขปัญหานี้ นอกจากนี้ Seekg() อาจเสี่ยงต่อการเปลี่ยนแปลงออบเจ็กต์สตรีมในสภาพแวดล้อมแบบมัลติเธรด ซึ่งจำเป็นต้องใช้ความระมัดระวังและการใช้กลไกการซิงโครไนซ์เพื่อลดการเปลี่ยนแปลงออบเจ็กต์ 'ofstream' ที่อาจเกิดขึ้น
ตัวอย่างที่ 1: พื้นฐานของ Seekg()
ในตัวอย่างแรก เราจะอธิบายพื้นฐานของฟังก์ชัน seekg() ในภาษา C++ รหัสของโปรแกรม C++ มีดังต่อไปนี้ ลองดูก่อนแล้วเราจะมาดูคำอธิบายของแต่ละส่วนของโค้ดกัน
#รวม
#รวม
ใช้เนมสเปซมาตรฐาน -
ภายใน หลัก - ภายใน อาร์กิวเมนต์ - ถ่าน - หาเรื่อง - -
fstream sgFile.dll - 'seekgFile.txt' - ไอโอเอส - ใน - ไอโอเอส - ออก - ไอโอเอส - กระโปรงหลังรถ - -
sgFile - 'ฟังก์ชันค้นหา ()' -
sgFile. แสวงหา - 8 - ไอโอเอส - ขอ - -
ถ่าน sgArray - 8 - -
sgFile. อ่าน - sgArray - 8 - -
sgArray - 8 - - 0 -
ศาล - sgArray - สิ้นสุด -
sgFile. ปิด - - -
-
โปรแกรมประกอบด้วยไฟล์ส่วนหัวที่จำเป็นสองไฟล์ -
fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – ที่นี่ “sgFile” ซึ่งเป็นอ็อบเจ็กต์ของคลาส “fstream” ถูกสร้างขึ้นเพื่อเป็นตัวแทนของสตรีมไฟล์ ไฟล์ชื่อ “seekgFile.txt” เชื่อมโยงกับสตรีมไฟล์ สตรีมไฟล์ถูกเปิดสำหรับเอาต์พุตอินพุต (ios::in) (ios::out) หากมีไฟล์อยู่ เนื้อหาจะถูกตัดทอน (ios::trunc)
sgFile << “ฟังก์ชัน seekg()”; – สตริง “ฟังก์ชัน seekg()” ถูกเขียนลงในไฟล์โดยใช้ตัวดำเนินการ “<<”
sgFile.seekg(8, ios::ขอ); - ฟังก์ชัน seekg() ใช้เพื่อตั้งค่าตัวชี้รับที่ตำแหน่งที่ 8 จากจุดเริ่มต้นของไฟล์ (ios::beg)
sgFile.read(sgArray, 8); - ฟังก์ชัน 'read' ใช้เพื่ออ่านอักขระแปดตัวจากตำแหน่งปัจจุบันของตัวชี้ get ไปยัง 'sgArray'
sgArray[8] = 0; - Null ยุติอาร์เรย์อักขระเพื่อให้แน่ใจว่ามีการจัดการสตริงที่เหมาะสม
ศาล << sgArray << endl; - เนื้อหาของ “sgArray” (อักขระ 8 ตัวที่อ่านจากไฟล์) จะแสดงบนคอนโซลโดยใช้ cout
sgFile.ปิด(); - ฟังก์ชัน close() ใช้เพื่อปิดสตรีมไฟล์
ผลลัพธ์ของโปรแกรมนี้คาดว่าจะเป็น 'ฟังก์ชัน' ให้เราตรวจสอบในตัวอย่างผลลัพธ์ต่อไปนี้:
โค้ดจะสร้างสตรีมไฟล์ที่เกี่ยวข้องกับไฟล์ “seekgFile.txt” เขียนสตริงลงในไฟล์ ค้นหาตำแหน่งที่ 8 จากจุดเริ่มต้น อ่านอักขระแปดตัว และส่งออกเนื้อหาที่อ่าน ในที่สุดสตรีมไฟล์ก็ถูกปิด
ตัวอย่างที่ 2: การนำทางแบบไดนามิก
พิจารณาสถานการณ์สมมติที่คุณต้องคำนวณออฟเซ็ต seekg() แบบไดนามิก ให้เราเข้าใจวิธีคำนวณออฟเซ็ตแบบไดนามิกด้วยความช่วยเหลือของตัวอย่างโค้ด
#รวม#รวม
ใช้เนมสเปซมาตรฐาน -
ภายใน หลัก - - -
ถ้าสตรีม sgFile - 'seekgFile.txt' - -
ภายใน ชดเชย - 8 -
sgFile. แสวงหา - ชดเชย - ไอโอเอส - ใส่ - -
ถ่าน กันชน - 8 - -
sgFile. อ่าน - กันชน - 8 - -
ศาล - 'เนื้อหา: ' - กันชน - สิ้นสุด -
sgFile. ปิด - - -
กลับ 0 -
-
อย่างที่คุณเห็น เรากำลังอ่านเนื้อหาจากไฟล์เดียวกับที่เราสร้างขึ้นในตัวอย่างก่อนหน้านี้ “seekgFile.txt” ฟังก์ชัน seekg() จะตั้งค่าตัวชี้รับที่ตำแหน่งปัจจุบัน (ios::cur) ในไฟล์ และจะถูกย้ายโดยออฟเซ็ตที่คำนวณได้ (8 ตัวอักษร) ฟังก์ชัน read() อ่านอักขระแปดตัวจากตำแหน่งปัจจุบันของตัวชี้ไปที่บัฟเฟอร์
เมื่อพิจารณาถึงเนื้อหาของไฟล์ 'ฟังก์ชัน seekg()' และออฟเซ็ตของอักขระแปดตัว โปรแกรมจะส่งออกสตริงย่อยที่เริ่มต้นจากอักขระตัวที่ 9 ของไฟล์ ดังนั้นผลลัพธ์ที่คาดหวังของโปรแกรมคือ “ฟังก์ชัน” ให้เรายืนยันในผลลัพธ์ที่กำหนดต่อไปนี้:
ตัวอย่างนี้แสดงให้เห็นถึงความยืดหยุ่นของการค้นหา () โดยการคำนวณออฟเซ็ตแบบไดนามิก
ตัวอย่างที่ 3: การนำทางจากจุดสิ้นสุด
ในตัวอย่างนี้ เราจะสาธิตวิธีการอ่านข้อมูลในไฟล์จากส่วนท้ายของไฟล์ ในที่นี้ Seekg() ใช้เพื่อนำทางจากจุดสิ้นสุดของไฟล์ ค่าชดเชยเชิงลบบ่งชี้ตำแหน่งที่สัมพันธ์กับจุดสิ้นสุด ดูรหัสที่กำหนดต่อไปนี้:
#รวม#รวม
ใช้เนมสเปซมาตรฐาน -
ภายใน หลัก - - -
ถ้าสตรีม sgFile - 'seekgFile.txt' - -
sgFile. แสวงหา - - 4 - ไอโอเอส - จบ - -
ถ่าน กันชน - 8 - -
sgFile. อ่าน - กันชน - 8 - -
ศาล - 'เนื้อหา: ' - กันชน - สิ้นสุด -
sgFile. ปิด - - -
กลับ 0 -
-
โปรแกรม C++ นี้เปิดไฟล์ชื่อ “seekgFile.txt” ซึ่งจะย้ายตัวชี้รับของอักขระสี่ตัวไปข้างหลังจากจุดสิ้นสุดของไฟล์โดยใช้ sgFile.seekg(-4, ios::end) อ่านอักขระแปดตัวถัดไปจากตำแหน่งนั้นลงใน บัฟเฟอร์ จากนั้นพิมพ์เนื้อหาของบัฟเฟอร์ไปยังคอนโซล เมื่อระบุเนื้อหาของไฟล์เป็น 'ฟังก์ชัน seekg()' ผลลัพธ์ที่คาดหวังคือ 'ction' ให้เราจับคู่ผลลัพธ์ในภาพหน้าจอของเอาต์พุตต่อไปนี้:
บทสรุป
โดยสรุป seekg() ปรากฏเป็นทรัพย์สินที่มีค่าสำหรับการนำทางสตรีมไฟล์ด้วยความแม่นยำ ด้วยความสามารถในการค้นหาตำแหน่งที่กำหนดเอง คำนวณออฟเซ็ตแบบไดนามิก และนำทางจากจุดต่างๆ ภายในไฟล์ ช่วยให้นักพัฒนาสามารถจัดการการทำงานของไฟล์ได้อย่างมีประสิทธิภาพ ดังที่เราได้เห็นในตัวอย่าง การเรียนรู้อย่างเชี่ยวชาญ seekg() ช่วยเพิ่มการควบคุมและความยืดหยุ่นของคุณเมื่อทำงานกับสตรีมไฟล์ใน C++ อย่างไรก็ตาม ต้องการการพิจารณาอย่างรอบคอบเกี่ยวกับการจัดการข้อยกเว้นและสถานการณ์การแข่งขันของข้อมูลที่อาจเกิดขึ้น เพื่อให้มั่นใจว่าการทำงานของไฟล์มีประสิทธิภาพและปราศจากข้อผิดพลาดใน C++