自定义输入流。流缓冲区和下溢方法

高掠食者

为了了解输入流的工作方式,我设计了以下两个类:

#include <iostream>

class my_streambuf: public std::streambuf
{
private:
  std::streambuf* buffer;

  char ch;

protected:

  virtual std::streambuf::int_type underflow()
  {
    std::streambuf::int_type result = buffer->sbumpc();

    if (result != traits_type::eof())
    {
      ch = traits_type::to_char_type(result);

      setg(&ch, &ch, &ch + 1);
    }

    return result;
  }

public:
  my_streambuf(std::streambuf* buffer) : buffer(buffer) {};

  virtual ~my_streambuf() {};
};

class my_istream: public std::istream
{
public:
  my_istream(std::istream& stream) : std::istream(new my_streambuf(stream.rdbuf())) {};

  virtual ~my_istream()
  {
    delete rdbuf();
  }
};

int main()
{
  char s[32];
  my_istream is(std::cin);

  is >> s;
  std::cout << s;
  return 0;
}

哪个工作正常,直到我更改underflow方法的逻辑主要目标是将数据保存在c字符串变量中s,这与用户输入不同。为了进行简单的测试,我将underflow方法更改为以下方法:

virtual std::streambuf::int_type underflow()
{
  std::streambuf::int_type result = buffer->sbumpc();

  if (result != traits_type::eof())
  {
    result = traits_type::to_int_type('+'); // <-- this was added

    ch = traits_type::to_char_type(result);

    setg(&ch, &ch, &ch + 1);
  }

  return result;
}

想法是使该方法仅返回+符号,而不返回用户输入的字符。因此,例如,如果输入为123,我希望+++将其存储在变量中s那是行不通的。控制台挂起,好像正在等待更多输入。只有一定数量的按键(或发送EOF)有帮助。

我在这里想念什么?


正如@ferosekhanj所指出的那样,问题在于缺少换行符,它的修改版本没有将其返回underflow给调用者。因此,为了使代码正常工作,必须将其返回。此版本的方法可以正常工作。

virtual std::streambuf::int_type underflow()
{
  std::streambuf::int_type result = buffer->sbumpc();

  if ((result != traits_type::eof()) && !traits_type::eq(traits_type::to_char_type(result), '\n'))
  {
     result = traits_type::to_int_type('+');

     ch = traits_type::to_char_type(result);

     setg(&ch, &ch, &ch + 1);
  }

  return result;
}
Ferosekhanj

根据我以前的C ++经验,流buf是该流的基础缓冲区。当流需要更多数据时,它称为下溢。在此方法中,您假设要从源代码和setg中读取。当流中有要写回源的数据时,它将调用溢出。在此方法中,您可以从流中读取,写回源和setp。例如,如果您正在从streambuf中的套接字读取数据

socketbuf::int_type socketbuf::underflow(){
  int bytesRead = 0;
  try{
    bytesRead = soc->read(inbuffer,BUFFER_SIZE-1,0);
    if( bytesRead <= 0 ){
      return traits_type::eof();
    }
  }catch(IOException ioe){
    cout<<"Unable to read data"<<endl;
    return traits_type::eof();
  }
  setg(inbuffer,inbuffer,inbuffer+bytesRead);
  return traits_type::to_int_type(inbuffer[0]);
}

socketbuf::int_type socketbuf::overflow(socketbuf::int_type c){
  int bytesWritten = 0;
  try{
    if(pptr() - pbase() > 0){
      bytesWritten = soc->write(pbase(),(pptr() - pbase()),0);
      if( bytesWritten <= 0 )  return traits_type::not_eof(c);
    }
  }catch(IOException ioe){
    cout<<"Unable to write data"<<endl;
    return traits_type::eof();
  }
  outbuffer[0] = traits_type::to_char_type(c);
  setp(outbuffer,outbuffer+1,outbuffer+BUFFER_SIZE);
  return traits_type::not_eof(c);
}

现在进入您的代码,您添加了

result = traits_type::to_int_type('+'); // <-- this was added

流读取一个字符串,直到看到LF(换行)为止。因此,当LF字符出现时,您会用'+'覆盖它,因此流将永远等待(对于LF)。通过添加此检查,您的代码应能达到您的期望。如果输入“ abc”,则输出“ +++”

if (result != 10)// <-- add this in addition
    result = traits_type::to_int_type('+'); // <-- this was added

希望对您有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SSIS自定义数据流组件循环输入管道缓冲区不止一次

来自分类Dev

C:什么是缓冲区下溢?

来自分类Dev

C:什么是缓冲区下溢?

来自分类Dev

缓冲区下溢异常Java

来自分类Dev

自定义缓冲输入流,可即时读取/拉出

来自分类Dev

流缓冲区大小小于输入流,但没有立即分段错误

来自分类Dev

Boost.Asio-具有自定义缓冲区的多个缓冲区

来自分类Dev

绘制自定义缓冲区类[Java]

来自分类Dev

DirectX缓冲区的自定义数据结构

来自分类Dev

帮助文本缓冲区中的自定义映射

来自分类Dev

康威的生命游戏缓冲区下溢

来自分类Dev

标准输入流 (pubsetbuf) 使用的内部缓冲区

来自分类Dev

如何摆脱“ rc缓冲区下溢”和“ HTTP错误503服务器太忙”的错误?

来自分类Dev

如何从环回自定义方法检索原始正文缓冲区以验证来自 webhook POST 的条带签名?

来自分类Dev

无法使用sed自定义mariadb Dockerfile中的缓冲区大小

来自分类Dev

由自定义缓冲区支持的C ++固定大小向量

来自分类Dev

如何使用自定义字符串快速填充缓冲区?

来自分类Dev

自定义OpenGL缓冲区类不显示任何内容

来自分类Dev

具有自定义TCP读取缓冲区的HTTP2客户端

来自分类Dev

无法为自定义对象oneAPI创建数据缓冲区

来自分类Dev

istream std :: cin如何修改自定义istream缓冲区?

来自分类Dev

如何自定义Emacs键绑定以转到特定行/缓冲区末尾

来自分类Dev

自定义回滚缓冲区导航键

来自分类Dev

使用自定义帧缓冲区时深度测试不起作用

来自分类Dev

初始化类路径时出错:缓冲区下溢 (Grails)

来自分类Dev

如何读取输入流缓冲区中存储的字符数

来自分类Dev

从带有缓冲区的网络输入流中读取的Java(需要排除空符号)

来自分类Dev

如何读取输入流缓冲区中存储的字符数

来自分类Dev

C ++-缓冲区和流都需要什么?

Related 相关文章

  1. 1

    SSIS自定义数据流组件循环输入管道缓冲区不止一次

  2. 2

    C:什么是缓冲区下溢?

  3. 3

    C:什么是缓冲区下溢?

  4. 4

    缓冲区下溢异常Java

  5. 5

    自定义缓冲输入流,可即时读取/拉出

  6. 6

    流缓冲区大小小于输入流,但没有立即分段错误

  7. 7

    Boost.Asio-具有自定义缓冲区的多个缓冲区

  8. 8

    绘制自定义缓冲区类[Java]

  9. 9

    DirectX缓冲区的自定义数据结构

  10. 10

    帮助文本缓冲区中的自定义映射

  11. 11

    康威的生命游戏缓冲区下溢

  12. 12

    标准输入流 (pubsetbuf) 使用的内部缓冲区

  13. 13

    如何摆脱“ rc缓冲区下溢”和“ HTTP错误503服务器太忙”的错误?

  14. 14

    如何从环回自定义方法检索原始正文缓冲区以验证来自 webhook POST 的条带签名?

  15. 15

    无法使用sed自定义mariadb Dockerfile中的缓冲区大小

  16. 16

    由自定义缓冲区支持的C ++固定大小向量

  17. 17

    如何使用自定义字符串快速填充缓冲区?

  18. 18

    自定义OpenGL缓冲区类不显示任何内容

  19. 19

    具有自定义TCP读取缓冲区的HTTP2客户端

  20. 20

    无法为自定义对象oneAPI创建数据缓冲区

  21. 21

    istream std :: cin如何修改自定义istream缓冲区?

  22. 22

    如何自定义Emacs键绑定以转到特定行/缓冲区末尾

  23. 23

    自定义回滚缓冲区导航键

  24. 24

    使用自定义帧缓冲区时深度测试不起作用

  25. 25

    初始化类路径时出错:缓冲区下溢 (Grails)

  26. 26

    如何读取输入流缓冲区中存储的字符数

  27. 27

    从带有缓冲区的网络输入流中读取的Java(需要排除空符号)

  28. 28

    如何读取输入流缓冲区中存储的字符数

  29. 29

    C ++-缓冲区和流都需要什么?

热门标签

归档