首页 > 其他分享 >练习8.1

练习8.1

时间:2023-07-11 22:34:22浏览次数:43  
标签:8.1 https 复位 练习 ignore failbit istream include

题目:写一个函数,接受一个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们这么做一定有他们的用意( )
image

还提供了一组函数方便访问这些位
image

如果流的操作发生了什么错误,并且设置了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'就停止忽略字符。

标签:8.1,https,复位,练习,ignore,failbit,istream,include
From: https://www.cnblogs.com/yuzuki/p/17539303.html

相关文章

  • Markdown练习笔记
    一级标题二级标题三级标题四级标题五级标题六级标题斜体粗体粗斜体换行引用嵌套cker-博客园(cnblogs.com)https://www.cnblogs.com/ckeri/无序列表有序列表删除下划线code#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<......
  • Xmake v2.8.1 发布,大量细节特性改进
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。我们......
  • IDApython练习1-脚本去花
    IDApython练习1-脚本去花这里主要是练习IDApython脚本去花1这里jz跳转条件是zf=1,jnz跳转条件是zf=0,但是zf就2种可能,所以无论如何都会跳转到loc_411DDF+3的位置,等于jmploc_411DDF+3.这里可以等长度的nop,我们可以手动nop,这里是脚本练习,需要我们自己写importidcdefcle......
  • 算法练习-day17
    二叉树110.平衡二叉树题意:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例:思路:本题我们可以自下而上判断二叉树是否为平衡二叉树,以上图为示例,我们先判断15是不是平衡二叉树,很明显......
  • java练习-插入排序
    packagecom.example.ss_0203_array.test.test_0710;/***分析:*1、数组遍历找出第一个开始乱序的索引,默认此索引之后的数组是无序的:startIndex*2、遍历数组,内嵌遍历后面的无序数组,比较当前数值和无序数组中的数值,大于则交换两个索引的数值,遍历完成,则数值交换完成*/publicc......
  • tomcat安装solr-8.11.2
    tomcat安装solr-8.11.2下载solr#解压tar-xzfsolr-8.11.2.tgz#制作war包cdsolr-8.11.2/server/solr-webapp/webapp/jarcvfsolr.war./*#将制作的war包复制到tomcat的webapps目录下cpsolr.war/tmp/apache-tomcat-9.0.75/webapps/#启动tomcat自动解压solr.warcd......
  • 数论专题练习
    数论专题练习A-BeautifulNumbers题意:输入a,b,n,求只包含a,b的n位数并且n位之和为a或b的数量枚举a和b的数量,判断它们的和是否为一个good_number,然后用组合数(详见数论的组合数)求和#include<bits/stdc++.h>usingnamespacestd;constintp=1e9+7;constintMAXN=1e6......
  • 牛客练习赛113 D 小红的数组操作(hard version)
    题目要求求出最小的总代价使得平均数为整数,转换式子可得实际就是求出a,b使得(a*x-b*y+sum)%n==0且a*p+b*q要最小,平均值的为sum/n,因此对sum进行操作使其成为n的倍数即可(a*x-b*y+sum)%n==0=>((a*x+sum)%n-b*y%n)%n==0因为(a*x+sum)%n<n,b*y%n<n,因此要想二者差求余数为0一定为(......
  • 20230708练习总结
    CF1785DWoodenSpoon为了方便,将题目中的大小关系反转一下。这是一个\(n+1\)层的满二叉树,第\(i\)层每个点都是\(2^{n-i+1}\)个人中的胜者。如果从下往上dp,需要记录胜利者编号和得到木勺者编号,会爆掉。那么从上往下dp。设\(dp_{i,j}\)表示第\(i\)层\(j\)胜利随即......
  • 数据结构练习
    数据结构练习[NOI2021]密码箱这么说Quack大爷就有队爷水平了首先考虑\(f\)是个线性变换这里对于\(\dfrac{x}{y}\rightarrow\dfrac{y}{x}+a_i\),第\(i\)个元素可以用矩阵表示\[\left[\begin{matrix}x&y\\0&0\\\end{matrix}\right]\times\left[\begin{matrix}......