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

米兰·哈拉波斯

我正在阅读Andrew Koenig(作者)的“ C ++实例编程实例”,在本章中4.1.3 Reading homework grades,有以下代码片段:

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`?? */
}

我有几个问题:

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

  2. if(in):就像在注释中一样,我知道true如果std::basic_ios::good根据文档,它可能会有价值,但是,参数中的istream是新鲜实例,因此调用它之前不应有任何错误状态,因此if子句是多余的。

  3. hw.clear():再次,无需清除向量。这是一个新实例,程序中以前没有填充过该实例,那么为什么要这样做呢?

  4. in.clear():这真的很困扰我。在非并行过程中这样做是否必不可少?我可以想到一种情况,何时清除缓冲区,即发生致命错误,否则,当缓冲区本身照顾错误时,我看不出要清除缓冲区的意义->传递了错误的值(即另一个值然后加倍这种情况)=>缓冲区只是忽略它,否则将调用EOF =>缓冲区将结束读取。缓冲区负责所有这些。

  5. 最后一个-如何std::cout连接in书中的语录:

我们不知道cin的工作原理的细节,但大概是库将其定义为一种数据结构,该数据结构存储了库需要了解的有关输入文件状态的所有信息。从标准输入文件读取输入会更改文件的状态,因此它在逻辑上也应更改cin的值。

我可以想象std::cin缓冲区的确是从键盘单词(由空格分隔)的输入中修改而来的,但是std::cout之间的连接在哪里in,只有while(cin >> x)修改了cin,但是如何cin知道将这些数据复制到另一个缓冲区中in呢?或者,in当该函数的唯一目的是填充矢量时,其目的甚至是什么?我想这与在某种程度上返回现在“修改过的”in末尾有关,但是我真的看不到这两个缓冲区之间的联系。

我知道这与上面的书有关,因此,如果您还没有阅读过,则可能没有上下文,但是有些问题不需要上下文。

// 注释表示我认为不需要的原始代码的一部分,并且如果进行编译,它仍然可以工作,因此确实不需要。

/**/ 解释了为什么我认为不需要

无论如何,对这些初学者的问题感到抱歉,我的背景仅仅是c

杰达兹
  1. 返回值:为什么函数具有istream类型作为返回值?为什么功能不无效?

函数类型肯定可以为空,您是正确的。但是,返回一个istream&允许链接,如下所示:

std::string name;
read_hw(cin, gradevec) >> name; 

这会将收到的第一个非双精度值cin放入name变量中。诚然,这是一个人为的示例,并不是最易读的示例,但是它确实说明了它是如何工作的。

  1. if(in):如注释中所述,我知道如果std::basic_ios::good根据文档,它可能具有真实值,但是,参数中的istream是新鲜实例

不,这不是一个新鲜的实例,它是一个参考值(由符号标志着&istream& in已经被定义的功能之外)。

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

再一次,实际上这不是一个新实例,它是对预先存在的向量(vector<double>&的引用C没有这样的引用,它只有指针,因此此答案可以帮助您更好地了解发生了什么。

  1. in.clear():这个真的很困扰我。在非并行过程中这样做是否必不可少?我可以想到一种情况,何时清除缓冲区,即发生致命错误。

in.clear()令人困惑的是,它不会清除整个缓冲区,而只会清除各种状态标志,例如afailbitbadbit您不想留下来并导致将来的I / O操作失败的状态标志

  1. 最后一个-如何std::cout连接in

为此,我只能猜测作者犯了一个错误并打算写while(in >> x)否则,根本没有合作in的余地。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: istream上的Windows IStream接口

来自分类Dev

C ++中的复合std :: istream

来自分类Dev

如何测试从std :: istream读取的类?

来自分类Dev

如何编写`std :: istream`运算符

来自分类Dev

使用std :: istream :: peek()总是安全吗?

来自分类Dev

std :: istream的运算符类型无效?

来自分类Dev

通过std :: istream从const std :: vector <char>读取

来自分类Dev

如何比较两个std :: istream引用?

来自分类Dev

如何安全地从std :: istream读取一行?

来自分类Dev

使用std :: copy时istream_iterator无效

来自分类Dev

为什么std :: istream_iterator忽略换行符?

来自分类Dev

C ++ std :: istream readsome不读取任何内容

来自分类Dev

asio :: streambuf到std :: istream丢弃新行

来自分类Dev

我不明白std :: istream_iterator的用法

来自分类Dev

错误:不匹配'operator >>'(操作数类型为'std :: istream'{aka'std :: basic_istream <char>'}和'const int')|

来自分类Dev

IStream的C#IStream实现

来自分类Dev

构建错误:对`yyFlexLexer::yyFlexLexer(std::istream*, std::ostream*) 的未定义引用

来自分类Dev

我可以使用istream_iterator <char>将一些istream内容复制到std :: string吗?

来自分类Dev

将特定数量的字符从std :: basic_istream复制到std :: string

来自分类Dev

在没有系统调用的线程之间使用std :: istream和std :: ostream(管道)

来自分类Dev

将特定数量的字符从std :: basic_istream复制到std :: string

来自分类Dev

是否有任何std :: istream操纵器消耗了输入中的预定义字符串?

来自分类Dev

如何通过允许传递临时变量的方式将std :: istream传递给函数?

来自分类Dev

如何将二进制十六进制文字输入std :: istream?

来自分类Dev

C ++如何初始化std :: istream *尽管构造函数受到保护

来自分类Dev

重载运算符>>:无法将'std :: basic_istream <char>'左值绑定到'std :: basic_istream <char> &&'

来自分类Dev

制作自定义istream机械手

来自分类Dev

How can you pass an std::istream into a function in a way that allows to pass temporaries?

来自分类Dev

Seek在使用boosting filter_istreambuf初始化的std :: istream上不起作用

Related 相关文章

  1. 1

    std :: istream上的Windows IStream接口

  2. 2

    C ++中的复合std :: istream

  3. 3

    如何测试从std :: istream读取的类?

  4. 4

    如何编写`std :: istream`运算符

  5. 5

    使用std :: istream :: peek()总是安全吗?

  6. 6

    std :: istream的运算符类型无效?

  7. 7

    通过std :: istream从const std :: vector <char>读取

  8. 8

    如何比较两个std :: istream引用?

  9. 9

    如何安全地从std :: istream读取一行?

  10. 10

    使用std :: copy时istream_iterator无效

  11. 11

    为什么std :: istream_iterator忽略换行符?

  12. 12

    C ++ std :: istream readsome不读取任何内容

  13. 13

    asio :: streambuf到std :: istream丢弃新行

  14. 14

    我不明白std :: istream_iterator的用法

  15. 15

    错误:不匹配'operator >>'(操作数类型为'std :: istream'{aka'std :: basic_istream <char>'}和'const int')|

  16. 16

    IStream的C#IStream实现

  17. 17

    构建错误:对`yyFlexLexer::yyFlexLexer(std::istream*, std::ostream*) 的未定义引用

  18. 18

    我可以使用istream_iterator <char>将一些istream内容复制到std :: string吗?

  19. 19

    将特定数量的字符从std :: basic_istream复制到std :: string

  20. 20

    在没有系统调用的线程之间使用std :: istream和std :: ostream(管道)

  21. 21

    将特定数量的字符从std :: basic_istream复制到std :: string

  22. 22

    是否有任何std :: istream操纵器消耗了输入中的预定义字符串?

  23. 23

    如何通过允许传递临时变量的方式将std :: istream传递给函数?

  24. 24

    如何将二进制十六进制文字输入std :: istream?

  25. 25

    C ++如何初始化std :: istream *尽管构造函数受到保护

  26. 26

    重载运算符>>:无法将'std :: basic_istream <char>'左值绑定到'std :: basic_istream <char> &&'

  27. 27

    制作自定义istream机械手

  28. 28

    How can you pass an std::istream into a function in a way that allows to pass temporaries?

  29. 29

    Seek在使用boosting filter_istreambuf初始化的std :: istream上不起作用

热门标签

归档