练习8.1
题目:写一个函数,接受一个istream&
参数,返回值也是istream&
。该函数必须从给定流中读取数据,直至遇到文件结束标识符时停止。将他读取的函数打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。
#include <iostream>
#include <istream>
#include <string>
using namespace std;
istream& func(istream& is)
{
string line;
while (std::getline(is, line))
{
cout << line;
}
is.clear();
return is;
}
int main()
{
func(cin);
return 0;
}
上面是我写的代码,总之我不理解什么事复位流,复位流有什么意义。
我找到一个网站说明流的状态
https://www.learncpp.com/cpp-tutorial/stream-states-and-input-validation/
流有好几种状态,用标志位来表示。不过这里的分了badbit和failbit(ta们这么做一定有他们的用意( )
还提供了一组函数方便访问这些位
如果流的操作发生了什么错误,并且设置了goodbit以外的值,后续对流的操作会无效,需要clear一下流(现在我知道对流的复位有什么用了)。
看看书上是怎么写的
#include <iostream>
#include <stdexcept>
using namespace std;
istream& f(istream& in)
{
int v;
while (in >> v, !in.eof())
{
if (in.bad())
{
throw runtime_error("IO流错误");
}
if (in.fail())
{
cerr << "数据错误,请重试: " << endl;
in.clear();
in.ignore(100, '\n');
continue;
}
cout << v << endl;
}
in.clear();
return in;
}
int main()
{
cout << "请输入一些整数, Ctrl+z 结束" << endl;
f(cin);
return 0;
}
书上的代码就比我的完善多了,首先通过in.bad()检查badbit有没有设置,有的话就直接抛出异常。然后in.fail()检查failbit位有没有被设置(例如我输入字符,在这个要求输入整数的例子里就会导致failbit被设置),如果被设置就clear复位流。in.ignore(100, '\n');我查了一下
The cin.ignore() function is used which is used to ignore or clear one or more characters from the input buffer.
有个回答https://stackoverflow.com/questions/33861470/what-cin-ignore-does-exactly 也解释了这个问题
https://blog.csdn.net/qq_27278957/article/details/88917911
大概就是忽略掉100个字符,或者碰到'\n'就停止忽略字符。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!