Поиск пути к достижению в начале буфера после ввода и чтение символов один за другим - PullRequest
0 голосов
/ 27 января 2019

Я хотел прочитать буфер, пока 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. Как я могу искать определенные символы в буфере, так как указатели защищены, и я не могу получить sbumpc или sgetc, чтобы сделать это.

1 Ответ

0 голосов
/ 27 января 2019

Получен ответ для поиска конкретного символа в буфере =>

#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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...