std::strstreambuf::seekpos(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸŽ€ NAME πŸŽ€

okay bestie, welcome to std::strstreambuf::seekpos(3) from the C++ Standard Libary manual. This is the std::strstreambuf::seekpos page β€” yes, the NAME line is literally std::strstreambuf::seekpos - std::strstreambuf::seekpos β€” and it's giving protected-virtual main character energy. πŸ¦‹πŸ’…

✨ Synopsis ✨

so here's the exact signature, served with all its original little vintage annotations:

          protected:

          virtual pos_type seekpos( pos_type sp,
       (deprecated in C++98)
                                    std::ios_base::openmode which =
       (removed in C++26)

                                        std::ios_base::in |
          std::ios_base::out );
heads up: (deprecated in C++98) and (removed in C++26) β€” yes, this one is vintage and endangered, so enjoy the vibe while it's here. πŸ’€

seekpos() repositions std::basic_streambuf::gptr and/or std::basic_streambuf::pptr, if possible, to the position indicated by sp.

If std::ios_base::in is set in which, it attempts to reposition gptr() β€” the next pointer in the get area. If std::ios_base::out is set in which, it attempts to reposition pptr() β€” the next pointer in the put area. If neither bit is set in which, the operation fails. no cap.

Each next pointer gets repositioned like this:

  • If the next pointer is null, the operation fails.
  • Otherwise, the new offset newoff (of type off_type) is determined by calling sp.offset(). If newoff is negative, out of bounds of the buffer, or invalid, the operation fails.
  • Otherwise, the next pointer is assigned as if by gptr() = eback() + newoff or pptr() = pbase() + newoff.

🫢 Parameters 🫢

  • sp β€” stream position, such as one obtained by seekoff() or seekpos().
  • which β€” defines whether the input sequences, the output sequence, or both are affected. It can be one or a combination of the following constants:
    • in β€” affect the input sequence
    • out β€” affect the output sequence

πŸ’– Return value πŸ’–

The resultant offset converted to pos_type on success, or pos_type(off_type(-1)) on failure. periodt. ✨

πŸ“ Notes πŸ“

seekpos() is called by std::basic_streambuf::pubseekpos(), which is called by the single-argument versions of std::basic_istream::seekg() and std::basic_ostream::seekp(). iykyk. 🫢

🎬 Example 🎬

okay this demo is iconic, bestie:

// Run this code

#include <cstring>
#include <iostream>
#include <strstream>

struct mybuf : std::strstreambuf
{
    mybuf(const char* str) : std::strstreambuf(str, std::strlen(str))
    {}

    pos_type seekpos(pos_type sp, std::ios_base::openmode which)
    {
        std::cout << "Before seekpos(" << sp << "), size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";

        pos_type rc = std::strstreambuf::seekpos(sp, which);

        std::cout << "seekpos() returns " << rc << ".\nAfter the call, "
                  << "size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";

        return rc;
    }
};

int main()
{
    mybuf buf("12345");
    std::iostream stream(&buf);
    stream.seekg(2);
}

πŸ“Ί Output πŸ“Ί

Before seekpos(2), size of the get area is 5 with 5 read positions available.
seekpos() returns 2.
After the call, size of the get area is 5 with 3 read positions available.

🩹 Defect reports 🩹

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • DR LWG 55; Applied to C++98; Behavior as published seekpos returned an undefined invalid stream position; Correct behavior pos_type(off_type(-1)) is returned on failure.

πŸ‘€ See also πŸ‘€

  • seekoff [virtual] β€” repositions the next pointer in the input sequence, output sequence, or both, using relative addressing (virtual protected member function).
  • seekpos [virtual] β€” repositions the next pointer in the input sequence, output sequence, or both using absolute addressing (virtual protected member function of std::basic_streambuf<CharT,Traits>).
  • seekpos [virtual] β€” repositions the next pointer in the input sequence, output sequence, or both using absolute addressing (virtual protected member function of std::basic_stringbuf<CharT,Traits,Allocator>).
  • seekpos [virtual] β€” repositions the file position, using absolute addressing (virtual protected member function of std::basic_filebuf<CharT,Traits>).

made with πŸ’– from http://cppreference.com, version/date 2024.06.10, for std::strstreambuf::seekpos(3) β€” bye bestie! 🫢🌈

πŸ“¦ where this page comes from