C ++ menggunakan streamoff
tipe untuk mewakili offset dalam aliran (file) dan didefinisikan sebagai berikut di [stream.types]:
using streamoff = implementation-defined ;
Jenis aliran adalah sinonim untuk salah satu tipe integral dasar yang ditandatangani dari ukuran yang cukup untuk mewakili ukuran file maksimum yang mungkin untuk sistem operasi. 287)
287) Biasanya panjang.
Ini masuk akal karena memungkinkan untuk mencari di dalam file besar (tidak seperti menggunakan long
, yang mungkin hanya 32 bit lebar).
[filebuf.virtuals] mendefinisikan basic_filebuf
fungsi untuk mencari di dalam file sebagai berikut:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
setara dengan streamoff
, lihat [iostreams.limits.pos]. Namun, standar kemudian menjelaskan efek fungsi. Saya kesal dengan kalimat terakhir, yang membutuhkan panggilan ke fseek
:
Efek : Biarkan
width
dilambangkana_codecvt.encoding()
. Jikais_open() == false
, atauoff != 0 && width <= 0
, maka operasi penentuan posisi gagal. Jika tidak, jikaway != basic_ios::cur
atauoff != 0
, dan jika operasi terakhir adalah output, maka perbarui urutan output dan tuliskan urutan unshift. Selanjutnya, cari ke posisi baru: jikawidth > 0
, panggilanfseek(file, width * off, whence)
, atau panggilanfseek(file, 0, whence)
.
fseek
menerima long
parameter. Jika off_type
dan streamoff
didefinisikan sebagai long long
(seperti yang disarankan oleh standar), ini dapat menyebabkan konversi turun ke long
saat menelepon fseek(file, width * off, whence)
(mengarah ke kemungkinan sulit mendiagnosis bug). Ini mempertanyakan seluruh alasan untuk memperkenalkan streamoff
jenis di tempat pertama.
Apakah ini disengaja atau cacat dalam standar?
seekoff
perlu digunakan di fseek
bawah tenda. Sebaliknya, perilaku (mungkin akrab?) fseek
Digunakan untuk menjelaskan apa yang seekoff
sedang dilakukan.
fseek
selama ia melakukan sesuatu dengan efek yang sama. Tetapi fseek
dengan offset kurang dari LONG_MIN
atau lebih besar dari LONG_MAX
tidak memiliki efek, sehingga penjelasannya paling tidak lengkap, setidaknya untuk implementasi di mana streamoff
lebih luas dari long
.