C++ istream std::cin如何修改自定义istream缓冲区?

C++ istream std::cin如何修改自定义istream缓冲区?,c++,io,buffer,istream,C++,Io,Buffer,Istream,我正在阅读,在4.1.3阅读家庭作业成绩一章中,有以下片段: istream& read_hw(istream& in, vector<double>& hw){ //if(in){ /* HOW can be istream be used as bool in condition? -> commented out, this is not needed */ //hw.clear(); /*WHY

我正在阅读,在
4.1.3阅读家庭作业成绩
一章中,有以下片段:

istream& read_hw(istream& in, vector<double>& hw){
    //if(in){      /* HOW can be istream be used as bool in condition? -> commented out, this is not needed */     
        //hw.clear();     /*WHY to clear vector, when every instance is used only once? -> commented out, not needed*/

        double x;
        while(cin >> x)
            hw.push_back(x);

        //in.clear();      /* why to clear istream from error state, when if wrong value is passed, it is ignored anyway -> commented out*/ 
    //}      /* this is connected with the if-block */
    return in;    /*how is now in(istream) modified? where is binding between `std::cout` and `in`?? */
}
istream&read\uhw(istream&in,vector&hw){
//如果(in){/*istream如何作为bool in条件使用?->注释掉,这是不需要的*/
//hw.clear();/*当每个实例只使用一次时,为什么要清除vector?->注释掉,不需要*/
双x;
而(cin>>x)
hw.推回(x);
//in.clear();/*为什么要从错误状态中清除istream,如果传递了错误的值,它将被忽略->注释掉*/
//}/*这与if块相连*/
return in;/*现在in(istream)是如何修改的?std::cout'和'in'之间的绑定在哪里*/
}
我有几个问题:

  • 返回值:为什么函数将istream类型作为返回值? 为什么功能不是无效的?当该函数的唯一目的是填充向量时,它不必返回任何值。(这个问题与最后一个问题有关,关于如何修改中的istream

  • if(in):在注释中,我知道如果
    std::basic_ios::good
    ,它可能有
    true
    值,但是,istream in参数是新实例,因此在调用它之前不应该有任何错误状态,因此if子句是多余的

  • hw.clear():同样,不需要清除向量。这是一个新实例,以前在程序中没有填充过,那么为什么要这样做呢

  • in.clear():这件真让我烦恼。在非并行过程中,这是必不可少的吗?我可以想到一种情况,当清除缓冲区时,即发生致命错误时,否则,我看不到清除缓冲区的意义,当缓冲区本身处理错误->传递错误值时(即在本例中是另一个值,然后加倍)=>缓冲区忽略它,或者调用EOF=>缓冲区将结束读取。缓冲区会处理好这一切

  • 最后一个-如何将
    std::cout
    中的
    连接?书中的引文:

  • 我们不知道cin如何工作的细节,但可能是图书馆 将其定义为一个数据结构,它存储库需要了解的关于我们数据库状态的所有信息 输入文件。从标准输入文件读取输入会更改文件的状态,因此从逻辑上也应该更改cin的值

    我可以想象
    std::cin
    缓冲区确实是从键盘输入的单词(用空格分隔)修改的,但是
    std::cout
    之间的连接在哪里,只有
    而(cin>>x)
    修改
    cin
    ,但是
    cin
    如何知道将这些数据复制到
    中的另一个缓冲区
    ?或者当函数的唯一目的是填充向量时,
    中的
    的目的是什么?我猜它与最后在
    中返回现在已“修改”的
    有关,但我看不到这两个缓冲区之间的联系

    我知道这与上面的书有关,所以如果你没有读过,你可能没有上下文,但有些问题不需要上下文

    /
    注释是指我注释掉的原始代码的一部分,我认为它是不需要的,如果编译了,它仍然可以工作,所以它确实是不需要的

    /**/
    解释了我认为不需要它的原因

    无论如何,对于这些初学者的问题,我很抱歉,我的背景只有
    c

  • 返回值:为什么函数有
    istream
    类型作为返回值?为什么功能不是无效的
  • 函数类型当然可能是空的,您是对的。但是,返回
    istream&
    允许链接,如下所示:

    std::字符串名称;
    读取(cin,gradevec)>>名称;
    
    这将把从
    cin
    接收到的第一个非双精度值放入
    name
    变量中。诚然,这是一个人为的例子,并不是最具可读性的,但它确实说明了它是如何工作的

  • if(in)
    :在注释中,我知道根据文档,如果
    std::basic\u ios::good
    ,它可能具有真实值,但是,istream in参数是fresh实例
  • 不,它不是一个新实例,它是一个引用(在
    istream&in
    中用符号和
    &
    表示),已在函数外部定义

  • hw.clear()
    :同样,不需要清除向量。这是一个新实例,以前在程序中没有填充过,那么为什么要这样做呢
  • 同样,事实上它不是一个新实例,它是对预先存在的向量(
    vector&
    )的引用。C没有这样的引用,它只有指针,所以可以帮助您更好地理解发生了什么

  • in.clear()
    :这件事真让我烦恼。在非并行过程中,这是必不可少的吗?我可以想到一种情况,当清除缓冲区时,即发生致命错误时
  • in.clear()
    有点令人困惑,它并没有清除整个缓冲区,它只是像一个
    failbit
    badbit
    那样,您不希望留下来导致将来的I/O操作失败

  • 最后一个-如何将
    std::cout
    中的
    连接

  • 对于这篇文章,我只能猜测作者犯了一个错误,打算写
    while(in>>x)
    。否则,在
    中使用
    毫无意义。

    您显示的代码实际上没有使用
    中的
    进行阅读。in`引用的流和
    std::cout
    引用的流之间没有明显的“绑定”(除非
    in
    引用)<