iostream,一些问题

时间:2010-02-26 20:57:10

标签: c++ iostream

我见过人们做的事情......

 istringstream ibuf;

 if (ibuf >>  zork >> iA >> Comma >> iB)

现在我猜这个值取决于>> iB暴露的内容,但究竟是什么,它是什么意思?真的意味着所有的iet都被提取了吗?

此外,在表达式

之后
 ibuf >>  zork >> iA >> Comma >> iB;

有没有办法找出提取的字符数和项目数?

3 个答案:

答案 0 :(得分:3)

这是因为istream对象的两个属性:

  • istreams在每次提取后返回自己(>>运算符)以允许链接多个提取(a >> b >> c
  • istreams在通过重载.good()
  • 进行转换/转换为bool时返回其状态(就像调用bool operator !()一样)

基本上你编写的代码是:

的简写版本
if ( ((((ibuf >> zork) >> ia) >> Comma) >> ib).good() ) {

}

一旦完成所有提取,您就会留下if (ibuf),这与写if ((bool)ibuf)隐含地相似,会检查ibuf.good()

无法获取通过一系列链式提取提取的字符数,但您可以使用函数gcount找到上次操作期间提取的字符数。但是,它仅适用于某些格式忽略函数,如getgetline,而不适用于提取运算符。

答案 1 :(得分:1)

第二段代码从ibuf读取一组值到它后面的变量。但是,隐藏operator >>()调用的返回是istringstream对象。没有直接的方法来获得字符数。

您可以查看gcount成员函数,该函数提供上次无格式输入操作的字符数。请注意,这是每个操作,因此不能使用级联。您还可以使用read成员函数。

编辑:

(ibuf >>  zork >> iA >> Comma >> iB)

实际上是:

((((ibuf.operator >>(zork)).operator >>(iA)).operator >>(Comma)).operator >>(iB))

括号的嵌套级别告诉您调用的顺序(和参数)。

答案 2 :(得分:0)

if (ibuf >>  zork >> iA >> Comma >> iB)

在逻辑上等于:

ibuf >> zork;
ibuf >> iA;
ibuf >> Comma;
ibuf >> iB;
if (ibuf) ...

“有没有办法找出提取的字符和项目数量?”

有成员函数“gcount”:http://www.cplusplus.com/reference/iostream/istream/gcount/