แม้ว่าฉันเข้าใจว่า fpos_t
เป็นประเภททึบแสงที่ตั้งใจจะเริ่มต้นโดยฟังก์ชัน fgetpos()
§7.19.9.1 ของ เหตุผล C99 ระบุว่า:
เพิ่ม
fgetpos
และfsetpos
ใน C89 เพื่ออนุญาตการเข้าถึงแบบสุ่มในไฟล์ที่มีขนาดใหญ่เกินกว่าจะจัดการกับfseek
และftell
ได้
และ§7.19.9.2:
ความจำเป็นในการเข้ารหัสทั้งตำแหน่งบันทึกและตำแหน่งภายในบันทึกด้วยค่า
long
อาจจำกัดขนาดของไฟล์ข้อความซึ่งสามารถใช้fseek
และftell
ให้มีขนาดเล็กกว่าขนาดของไฟล์ไบนารีได้อย่างมาก...
เพิ่ม
fgetpos
และfsetpos
เพื่อจัดการกับไฟล์ที่มีขนาดใหญ่เกินกว่าจะจัดการกับfseek
และftell
ดูเหมือนว่าจะเน้นไปที่ไฟล์ข้อความเป็นหลัก (ไฟล์ที่เปิดด้วย mode
ยกเว้นแฟล็ก b
) เนื่องจากการใช้งานบางอย่างอาจจำเป็นต้องจัดเก็บสองตำแหน่ง (ตำแหน่งบันทึกไฟล์และตำแหน่งอักขระบันทึก) ซึ่งอาจลดช่วงที่มีประสิทธิภาพของ fseek()
ได้อย่างมาก และฟังก์ชัน ftell()
สำหรับการสตรีมข้อความ
อย่างไรก็ตาม ฉันไม่เข้าใจว่าสิ่งนี้มีประโยชน์อย่างยิ่งสำหรับสตรีมข้อความอย่างไร และแน่นอนว่าฉันไม่เข้าใจว่ามันจะนำไปใช้กับ "การเข้าถึงแบบสุ่ม" ได้อย่างมีประสิทธิภาพได้อย่างไร
ดูเหมือนว่าวิธีเดียวที่จะใช้ฟังก์ชันเหล่านี้ได้จริงคือการอ่านอักขระทุกตัวในไฟล์และแคชค่า fgetpos()
d fpos_t
ซึ่งดูดีที่สุด เนื่องจากคุณแทบไม่ต้องการอ่านที่ใกล้กับอักขระ LONG_MAX
ตัวเลย
“คณะกรรมการ” คิดอะไรอยู่? มีเหตุผลเหตุผล C99 หรือไม่?