C++ streambuf::underflow() 函数



C++ 的 std::streambuf::underflow() 函数在输入序列耗尽时被调用,这意味着没有更多字符可供读取。它尝试在不推进当前位置的情况下将字符重新提取到缓冲区中,以便进行输入操作。

默认情况下,underflow() 函数返回 traits_type::eof() 以指示失败。

语法

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

int underflow();

参数

它不接受任何参数。

返回值

如果可用,它返回当前 get 指针位置 (gptr) 处的字符。否则,它返回文件结束值。

异常

如果抛出异常,则对象处于有效状态。

数据竞争

它访问 basic_stringbuf 对象。

示例 1

让我们看下面的例子,我们将检查空缓冲区的 underflow。

#include <iostream>
#include <streambuf>
class a: public std::streambuf {
   protected: int_type underflow() override {
      return traits_type::eof();
   }
};
int main() {
   a buf;
   std::istream input( & buf);
   char x;
   if (!input.get(x)) {
      std::cout << "underflow Detected.\n";
   }
}

输出

以上代码的输出如下:

underflow Detected.

示例 2

考虑下面的例子,我们将通过在 underflow() 函数中重置 get 指针来重用缓冲区。

#include <iostream>
#include <streambuf>
class x: public std::streambuf {
   char data[10] = "WELCOME ";
   protected:
      int_type underflow() override {
         if (gptr() == egptr()) {
            setg(data, data, data + 9);
         }
         return traits_type::to_int_type( * gptr());
      }
};
int main() {
   x y;
   std::istream input( & y);
   for (int a = 0; a < 18; ++a) {
      char c;
      input.get(c);
      std::cout << c;
   }
}

输出

以下是以上代码的输出:

WELCOME .WELCOME .
streambuf.htm
广告