C ++ menggunakan streamofftipe 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_filebuffungsi 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_typesetara dengan streamoff, lihat [iostreams.limits.pos]. Namun, standar kemudian menjelaskan efek fungsi. Saya kesal dengan kalimat terakhir, yang membutuhkan panggilan ke fseek:
Efek : Biarkan
widthdilambangkana_codecvt.encoding(). Jikais_open() == false, atauoff != 0 && width <= 0, maka operasi penentuan posisi gagal. Jika tidak, jikaway != basic_ios::curatauoff != 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).
fseekmenerima longparameter. Jika off_typedan streamoffdidefinisikan sebagai long long(seperti yang disarankan oleh standar), ini dapat menyebabkan konversi turun ke longsaat menelepon fseek(file, width * off, whence)(mengarah ke kemungkinan sulit mendiagnosis bug). Ini mempertanyakan seluruh alasan untuk memperkenalkan streamoffjenis di tempat pertama.
Apakah ini disengaja atau cacat dalam standar?
seekoffperlu digunakan di fseek bawah tenda. Sebaliknya, perilaku (mungkin akrab?) fseekDigunakan untuk menjelaskan apa yang seekoffsedang dilakukan.
fseekselama ia melakukan sesuatu dengan efek yang sama. Tetapi fseekdengan offset kurang dari LONG_MINatau lebih besar dari LONG_MAXtidak memiliki efek, sehingga penjelasannya paling tidak lengkap, setidaknya untuk implementasi di mana streamofflebih luas dari long.