首页 > 解决方案 > 输入输入并逐个读取字符后,找到到达缓冲区开头的方法

问题描述

我想读取缓冲区,直到EOF在缓冲区中找到,然后将流设置为损坏或损坏。如果epack()不是受保护的成员函数,我可以尝试一下:

std::string s;
int position=0;
char c;

std::streambuf *buffer_obj = std::cin.rdbuf();

/*ASSOCIATING STREAM_OBJ WITH INPUT BUFFER*/
std::istream stream_obj(buffer_obj);

/*ENTER "ABC" THEN PRESS CTRL+D TO INPUT EOF THEN ENTER "DEF"*/
stream_obj>>s;          

/*LOOP STARTS FOR EOF*/
if((c=*(std::buffer_obj->eback()[position++])) != EOF)
{
    std::cout<<c;
}
else
{
    std::cout<<"EOF in buffer"<<endl;
    break;
}
/*LOOP ENDS*/

两个问题:

  1. 如果eback()公共功能,上面的代码是否有效?
  2. 我如何在缓冲区中搜索特定字符,因为指针受到保护并且我无法获取sbumpcsgetc执行此操作。

标签: c++io

解决方案


得到了在缓冲区中查找特定字符的答案 =>

#include<iostream>
#include<string>

int main()
{
    int i;
    std::streambuf *obj=std::cin.rdbuf();
    std::istream sobj(obj);

    /*THIS ONE EXTRACTS FROM THE BUFFER ONE CHARACTER AT A TIME*/
    while((i=sobj.std::istream::get())!=EOF) 
    {
        std::cout<<(char)i;
    }

    /*EOFBIT IS SET FOR THE STREAM WHEN EOF IS ENCOUNTERED*/ 
    if(sobj.eof()==true)     
    {
        std::cout<<"EOF FOUND"<<std::endl;
    }


    return 0;
}

类似地,任何字符都可以在缓冲区中找到,并且sobj可以替换为cin并且可以检查EOF。例如,假设要查找的字符是D,我们需要在缓冲区中找到D后停止读取:

int i;

while((i=std::cin.std::istream::get())!='D')
{
   std::cout<<(char)i;
}

所以如果输入是,avb45Dert那么输出将是avb45


推荐阅读