C ++ sử dụng streamoff
loại để biểu thị phần bù trong luồng (tệp) và được định nghĩa như sau trong [stream.types]:
using streamoff = implementation-defined ;
Streamoff loại là một từ đồng nghĩa cho một trong các loại tích phân cơ bản đã ký có kích thước đủ để thể hiện kích thước tệp tối đa có thể cho hệ điều hành. 287)
287) Điển hình là dài dài.
Điều này có ý nghĩa bởi vì nó cho phép tìm kiếm trong các tệp lớn (trái ngược với việc sử dụng long
, có thể chỉ rộng 32 bit).
[filebuf.virtuals] xác định basic_filebuf
chức năng tìm kiếm trong một tệp như sau:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
tương đương với streamoff
, xem [iostreams.limits.pose]. Tuy nhiên, tiêu chuẩn sau đó tiếp tục để giải thích các hiệu ứng của chức năng. Tôi bị kích thích bởi câu cuối cùng, đòi hỏi một cuộc gọi đến fseek
:
Tác dụng : Hãy
width
biểu thịa_codecvt.encoding()
. Nếuis_open() == false
, hoặcoff != 0 && width <= 0
, sau đó hoạt động định vị không thành công. Mặt khác, nếuway != basic_ios::cur
hoặcoff != 0
và nếu thao tác cuối cùng là đầu ra, thì hãy cập nhật chuỗi đầu ra và ghi bất kỳ chuỗi không dịch chuyển nào. Tiếp theo, tìm đến vị trí mới: nếuwidth > 0
, gọifseek(file, width * off, whence)
, nếu không hãy gọifseek(file, 0, whence)
.
fseek
chấp nhận một long
tham số. Nếu off_type
và streamoff
được định nghĩa là long long
(như được đề xuất bởi tiêu chuẩn), điều này có thể dẫn đến chuyển đổi xuống long
khi gọi fseek(file, width * off, whence)
(dẫn đến khả năng khó chẩn đoán lỗi). Điều này đặt ra câu hỏi cho toàn bộ lý do để giới thiệu streamoff
loại ở nơi đầu tiên.
Đây là cố ý hay một khiếm khuyết trong tiêu chuẩn?
seekoff
nhất thiết phải sử dụng fseek
dưới mui xe. Thay vào đó, hành vi (có lẽ quen thuộc?) fseek
Được sử dụng để giải thích những gì seekoff
đang làm.
fseek
miễn là nó làm điều gì đó có cùng hiệu ứng. Nhưng fseek
với phần bù nhỏ hơn LONG_MIN
hoặc lớn hơn LONG_MAX
không có tác dụng, do đó, lời giải thích ít nhất là không đầy đủ, ít nhất là cho các triển khai ở nơi streamoff
rộng hơn long
.