C++ streambuf::pubseekoff() 函数



C++ 的std::streambuf::pubseekoff()函数用于在流中查找特定位置。它允许重新定位流的内部指针相对于给定偏移量,该偏移量可以指定为绝对位置或相对位置。

如果成功,此函数返回流的新位置;如果发生错误,则返回std::streampos(-1)。

语法

以下是std::streambuf::pubseekoff()函数的语法。

pos_type pubseekoff (off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out);

参数

  • off − 表示偏移值。
  • way − 表示ios_base::seekdir类型的对象。
  • which − 通常用于确定应修改受控序列中的哪个位置。

返回值

此函数返回修改后的位置指针的新位置值。

异常

如果抛出异常,则流缓冲区处于有效状态。

数据竞争

它修改流缓冲区对象。

示例 1

让我们来看下面的例子,我们将查找流的开头。

#include <iostream>
#include <sstream>
int main() {
   std::stringstream a("WELCOME");
   std::streambuf * b = a.rdbuf();
   b -> pubseekoff(0, std::ios::beg);
   std::cout << static_cast < char > (b -> sgetc()) << std::endl;
   return 0;
}

输出

以上代码的输出如下:

W

示例 2

考虑下面的例子,我们将把位置从末尾向后移动8个字符,并插入“welcome”。

#include <iostream>
#include <sstream>
int main() {
   std::ostringstream a;
   a.str("Vanakam to TutorialsPoint");
   a.rdbuf() -> pubseekoff(-8, std::ios::end);
   a << "Welcome ";
   std::cout << "Result : " << a.str() << std::endl;
   return 0;
}

输出

以下是以上代码的输出:

Result : Welcome to TutorialsPoint

示例 3

在下面的例子中,我们将查找流长度之外的位置,并观察输出。

#include <iostream>
#include <sstream>
int main() {
   std::stringstream a("Hi");
   std::streambuf * b = a.rdbuf();
   std::streampos c = b -> pubseekoff(5, std::ios::beg);
   if (c == std::streampos(-1)) {
      std::cout << "Invalid" << std::endl;
   } else {
      std::cout << "Result : " << c << std::endl;
   }
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出:

Invalid
streambuf.htm
广告