ฟังก์ชัน C++ Seekg()

Fangkchan C Seekg



ในการเขียนโปรแกรม C++ ฟังก์ชัน Seekg() จะให้ความช่วยเหลือภายในสตรีมไฟล์ มันเป็นสมาชิกของไลบรารี iostream และคุณจะพบมันในส่วนหัว ฟังก์ชันนี้ช่วยให้โปรแกรมเมอร์สามารถจัดการได้ว่าการดำเนินการป้อนข้อมูลครั้งถัดไปจะเริ่มต้นขึ้นเมื่อใด จึงทำให้กระบวนการทำงานกับไฟล์คล่องตัวขึ้น เมธอด seekg() ช่วยให้คุณข้ามไปยังตำแหน่งเฉพาะในไฟล์ซึ่งมีค่าอย่างยิ่งเมื่อคุณต้องการอ่านหรือประมวลผลข้อมูลที่ไม่ได้จัดเรียงตามลำดับ ไม่ว่าคุณจะตั้งเป้าที่จะอ่านตั้งแต่ต้น กลาง หรือท้ายไฟล์ seekg() จะให้ความยืดหยุ่นที่จำเป็นสำหรับงานดังกล่าว ตลอดทั้งคู่มือนี้ เราจะเจาะลึกว่าฟังก์ชัน seekg() ใน C++ ช่วยให้ดึงข้อมูลจากจุดต่างๆ ภายในไฟล์ได้อย่างไร

ไวยากรณ์และพารามิเตอร์ของฟังก์ชัน 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. ปิด - - -

-

โปรแกรมประกอบด้วยไฟล์ส่วนหัวที่จำเป็นสองไฟล์ - และ - สำหรับการจัดการไฟล์และการดำเนินการอินพุต/เอาท์พุต ตามลำดับ หลังจากนั้น “การใช้เนมสเปซ std;” รวมคำสั่งไว้ด้วย อนุญาตให้ใช้ตัวระบุ C++ มาตรฐานโดยไม่ต้องระบุเนมสเปซอย่างชัดเจน ในที่สุด ฟังก์ชันหลักก็เริ่มต้นขึ้น ซึ่งเป็นจุดเริ่มต้นของโปรแกรม โดยรับอาร์กิวเมนต์บรรทัดคำสั่ง (argc และ argv)

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++