C ++ używa tego streamofftypu do reprezentowania przesunięcia w strumieniu (pliku) i jest zdefiniowany w następujący sposób w [stream.types]:
using streamoff = implementation-defined ;Typ streamoff jest synonimem jednego z podpisanych podstawowych integralnych typów o wystarczającym rozmiarze, aby reprezentować maksymalny możliwy rozmiar pliku dla systemu operacyjnego. 287)
287) Zazwyczaj długi.
Ma to sens, ponieważ pozwala na wyszukiwanie w dużych plikach (w przeciwieństwie do używania long, które może mieć tylko 32 bity szerokości).
[filebuf.virtuals] definiuje basic_filebuffunkcję wyszukiwania w pliku w następujący sposób:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_typejest równoważne streamoff, patrz [iostreams.limits.pos]. Jednak standard wyjaśnia dalej efekty tej funkcji. Denerwuje mnie ostatnie zdanie, które wymaga połączenia z fseek:
Efekty : Niech
widthoznacza_codecvt.encoding(). Jeśliis_open() == falseluboff != 0 && width <= 0, operacja pozycjonowania kończy się niepowodzeniem. W przeciwnym razie, jeśliway != basic_ios::curluboff != 0, i jeśli została wykonana ostatnia operacja, zaktualizuj sekwencję wyjściową i zapisz dowolną sekwencję cofania. Następnie szukaj nowej pozycji: jeśliwidth > 0zadzwońfseek(file, width * off, whence), w przeciwnym razie zadzwońfseek(file, 0, whence).
fseekakceptuje longparametr. Jeśli off_typei streamoffsą zdefiniowane jako long long(jak sugeruje standard), może to prowadzić do obniżenia konwersji do longpodczas wywoływania fseek(file, width * off, whence)(prowadząc do potencjalnie trudnych do zdiagnozowania błędów). To podważa całe uzasadnienie wprowadzenia tego streamofftypu w pierwszej kolejności.
Czy jest to celowe czy wada normy?
seekoffkonieczność użycia fseek pod maską. Raczej (przypuszczalnie znajome?) Zachowanie fseeksłuży raczej do wyjaśnienia, co seekoffsię dzieje.
fseeko ile robi coś z tym samym efektem. Ale fseekz przesunięciem mniejszym LONG_MINlub większym niż LONG_MAXnie ma żadnego efektu, więc wyjaśnienie jest w najlepszym razie niekompletne, przynajmniej w przypadku wdrożeń, które streamoffsą szersze niż long.