C ++ używa tego streamoff
typu 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_filebuf
funkcję 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_type
jest 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
width
oznacza_codecvt.encoding()
. Jeśliis_open() == false
luboff != 0 && width <= 0
, operacja pozycjonowania kończy się niepowodzeniem. W przeciwnym razie, jeśliway != basic_ios::cur
luboff != 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 > 0
zadzwońfseek(file, width * off, whence)
, w przeciwnym razie zadzwońfseek(file, 0, whence)
.
fseek
akceptuje long
parametr. Jeśli off_type
i streamoff
są zdefiniowane jako long long
(jak sugeruje standard), może to prowadzić do obniżenia konwersji do long
podczas 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 streamoff
typu w pierwszej kolejności.
Czy jest to celowe czy wada normy?
seekoff
konieczność użycia fseek
pod maską. Raczej (przypuszczalnie znajome?) Zachowanie fseek
służy raczej do wyjaśnienia, co seekoff
się dzieje.
fseek
o ile robi coś z tym samym efektem. Ale fseek
z przesunięciem mniejszym LONG_MIN
lub większym niż LONG_MAX
nie ma żadnego efektu, więc wyjaśnienie jest w najlepszym razie niekompletne, przynajmniej w przypadku wdrożeń, które streamoff
są szersze niż long
.