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