C ++ sử dụng streamoffloạ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_filebufchứ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_typetươ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
widthbiể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::curhoặcoff != 0và 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).
fseekchấp nhận một longtham số. Nếu off_typevà 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 longkhi 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 streamoffloại ở nơi đầu tiên.
Đây là cố ý hay một khiếm khuyết trong tiêu chuẩn?
seekoffnhấ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.
fseekmiễn là nó làm điều gì đó có cùng hiệu ứng. Nhưng fseekvới phần bù nhỏ hơn LONG_MINhoặc lớn hơn LONG_MAXkhô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 streamoffrộng hơn long.