C ++, streamoff
bir (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_filebuf
bir 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_type
eşdeğeridir streamoff
, bkz. [iostreams.limits.pos]. Ancak, standart fonksiyonun etkilerini açıklamaya devam eder. Son cümle beni rahatsız ediyor fseek
:
Etkileri :
width
Belirtelima_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::cur
veyaoff != 0
son işlem çıktıysa, çıktı sırasını güncelleyin ve herhangi bir kaydırma sırasını yazın. Sonra, yeni pozisyonuwidth > 0
arayın : if , callfseek(file, width * off, whence)
, aksi takdirde callfseek(file, 0, whence)
.
fseek
bir long
parametreyi kabul eder . Eğer off_type
ve streamoff
olarak 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, streamoff
türü ilk etapta tanıtmanın tüm mantığını sorgulamaktadır .
Bu kasıtlı mı yoksa standartta bir kusur mu?
seekoff
mutlaka kullanılması gibi görünmüyor fseek
. Bunun yerine, (muhtemelen bilindik?) Davranışı fseek
ne seekoff
yaptığı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_MIN
veya daha büyük bir ofsetin bir LONG_MAX
etkisi yoktur, bu nedenle açıklama en azından eksiktir, en azından streamoff
daha geniş olan uygulamalar için long
.