c++ - 输入输入并逐个读取字符后,找到到达缓冲区开头的方法
问题描述
我想读取缓冲区,直到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*/
两个问题:
- 如果
eback()
是公共功能,上面的代码是否有效? - 我如何在缓冲区中搜索特定字符,因为指针受到保护并且我无法获取
sbumpc
或sgetc
执行此操作。
解决方案
得到了在缓冲区中查找特定字符的答案 =>
#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
。
推荐阅读
- google-cloud-platform - 如何使用 CLI 将静态外部 IP 地址附加到谷歌云计算实例
- go - 如何处理 GORM 提交/回滚错误
- asp.net-core - 如何修复来自 HTTP Post 方法的验证错误
- ruby-on-rails - 如何获取rails上的参数总数
- javascript - 调查 JS 在 Json 而不是 XML 中获取调查结果响应
- android - AWS CustomTabsManagerActivity.java 在 android 上崩溃
- javascript - Javascript:将地图转换为对象数组
- python - 如何在 tkinter 的 Canvas 上使用覆盖 Vkeyboard?
- scala - 如何在 Zeppelin(Scala) 中将数据帧转换为 Seq
- python - 询问用户输入数据然后使用该数据查找 XPath?