C ++, streamoffbir (dosya) akışı içindeki bir ofseti temsil etmek için türü kullanır ve [stream.types] içinde aşağıdaki gibi tanımlanır:
using streamoff = implementation-defined ;Streamoff türü, işletim sistemi için mümkün olan maksimum dosya boyutunu temsil etmek için yeterli büyüklükte imzalı temel integral türlerinden birinin eş anlamlısıdır. 287)
287) Genellikle uzun uzun.
Bu mantıklıdır çünkü büyük dosyalar içinde arama yapmaya izin verir (kullanımın aksine long, sadece 32 bit genişliğinde olabilir).
[filebuf.virtuals] basic_filebufbir dosyada arama işlevini aşağıdaki gibi tanımlar:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typeeşdeğeridir streamoff, bkz. [iostreams.limits.pos]. Ancak, standart fonksiyonun etkilerini açıklamaya devam eder. Son cümle beni rahatsız ediyor fseek:
Etkileri :
widthBelirtelima_codecvt.encoding(). Eğeris_open() == false, veyaoff != 0 && width <= 0, daha sonra yerleştirme işlemi başarısız olur. Aksi takdirde, eğerway != basic_ios::curveyaoff != 0son işlem çıktıysa, çıktı sırasını güncelleyin ve herhangi bir kaydırma sırasını yazın. Sonra, yeni pozisyonuwidth > 0arayın : if , callfseek(file, width * off, whence), aksi takdirde callfseek(file, 0, whence).
fseekbir longparametreyi kabul eder . Eğer off_typeve streamoffolarak tanımlanır long long(standart önerdiği gibi), bu bir aşağı dönüştürme yol açabilir longçağrılırken fseek(file, width * off, whence)(böcek teşhis etmek potansiyel zor yol açan). Bu, streamofftürü ilk etapta tanıtmanın tüm mantığını sorgulamaktadır .
Bu kasıtlı mı yoksa standartta bir kusur mu?
seekoffmutlaka kullanılması gibi görünmüyor fseek. Bunun yerine, (muhtemelen bilindik?) Davranışı fseekne seekoffyaptığını açıklamak için kullanılır .
fseek, aynı etkiye sahip bir şey yaptığı sürece gerçekten çağırmak zorunda olmadığı anlamına gelebilecek şekilde yorumlanabileceğini kabul ediyorum . Ancak fseek, bir ofsetten daha az LONG_MINveya daha büyük bir ofsetin bir LONG_MAXetkisi yoktur, bu nedenle açıklama en azından eksiktir, en azından streamoffdaha geniş olan uygulamalar için long.