C ++ ใช้streamoff
ชนิดเพื่อแสดงออฟเซ็ตภายในสตรีม (ไฟล์) และกำหนดไว้ดังนี้ใน [stream.types]:
using streamoff = implementation-defined ;
ประเภท streamoff เป็นคำพ้องความหมายสำหรับหนึ่งในประเภทอินทิกรัลพื้นฐานที่ลงนามแล้วซึ่งมีขนาดเพียงพอที่จะแสดงขนาดไฟล์สูงสุดที่เป็นไปได้สำหรับระบบปฏิบัติการ 287)
287) ความยาวโดยทั่วไป
สิ่งนี้สมเหตุสมผลเนื่องจากอนุญาตให้ค้นหาไฟล์ขนาดใหญ่ (ต่างจากการใช้long
ซึ่งอาจมีความกว้างเพียง 32 บิต)
[filebuf.virtuals] กำหนดbasic_filebuf
ฟังก์ชั่นของการค้นหาภายในไฟล์ดังนี้:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
เทียบเท่ากับstreamoff
ดู [iostreams.limits.pos] อย่างไรก็ตามมาตรฐานก็จะอธิบายผลกระทบของฟังก์ชั่น ฉันรู้สึกหงุดหงิดกับประโยคสุดท้ายที่ต้องเรียกร้องให้fseek
:
ผลกระทบ : อนุญาต
width
แสดงa_codecvt.encoding()
ว่า หากis_open() == false
หรือoff != 0 && width <= 0
จากนั้นการดำเนินการกำหนดตำแหน่งจะล้มเหลว มิฉะนั้นถ้าway != basic_ios::cur
หรือoff != 0
หากการดำเนินการครั้งสุดท้ายเป็นผลลัพธ์ให้อัปเดตลำดับเอาต์พุตและเขียนลำดับ unshift ใด ๆ ถัดไปขอไปยังตำแหน่งใหม่: ถ้าwidth > 0
โทรมิฉะนั้นโทรfseek(file, width * off, whence)
fseek(file, 0, whence)
fseek
ยอมรับlong
พารามิเตอร์ หากoff_type
และstreamoff
ถูกกำหนดเป็นlong long
(ตามที่แนะนำโดยมาตรฐาน) สิ่งนี้อาจนำไปสู่การแปลงลงเป็นlong
เมื่อโทรfseek(file, width * off, whence)
(นำไปสู่การยากที่จะวินิจฉัยข้อบกพร่อง) คำถามนี้เกี่ยวกับเหตุผลทั้งหมดสำหรับการแนะนำstreamoff
ประเภทในตอนแรก
นี่เป็นเจตนาหรือข้อบกพร่องในมาตรฐานหรือไม่?
seekoff
จำเป็นต้องใช้ fseek
ภายใต้ประทุน แต่พฤติกรรมที่คุ้นเคย (สันนิษฐาน?) ของfseek
ใช้เพื่ออธิบายสิ่งที่seekoff
กำลังทำ
fseek
ตราบใดที่มันมีผลแบบเดียวกัน แต่fseek
ด้วยการชดเชยน้อยกว่าLONG_MIN
หรือมากกว่าLONG_MAX
ไม่มีผลดังนั้นคำอธิบายที่ดีที่สุดที่ไม่สมบูรณ์อย่างน้อยสำหรับการใช้งานที่กว้างกว่าstreamoff
long