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'之间的绑定在哪里*/
}
我有几个问题:
)
std::basic_ios::good
,它可能有true
值,但是,istream in参数是新实例,因此在调用它之前不应该有任何错误状态,因此if子句是多余的
std::cout
与中的连接?书中的引文:
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
引用)<