测试istream对象

时间:2016-08-08 17:05:44

标签: c++ iostream istream

当我在测试中使用std :: istream对象(在下面的例子中来自cplusplus.com,std :: ifstream)时:" if(myistreamobject)",对象,这是自动分配在堆栈中永远不会为空,对吧?...在​​下面的例子中,我们使用相同的测试来检查是否所有字节都是从文件中读取的......这真的是一个奇怪的代码,当我处理指针时,我通常使用那种风格......

我想知道在std :: istream中使用哪种机制来在测试中返回一个值,这个值的真正意义是什么......(上一次操作的成功/失败??)是一个重载bool cast(就像在MFC类CString中强制转换的const char *操作符)或者它是另一种技术吗?

因为对象永远不会为null,所以将它放在测试中将始终返回true。

function onOpen() 
{
var ss = SpreadsheetApp.getActiveSheet();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Required Items List');
var ss = SpreadsheetApp.getActive();
var range = sheet.getRange('Required Items List!E8:G22');
var data = range.getValue();
var today = new Date();

    Logger.log(data);
    Logger.log(today);

      if (data == today) 
      { 
        Browser.msgBox('Send Required Items Reminders Today!', Browser.Buttons.OK);
      }

    else {}
}

3 个答案:

答案 0 :(得分:3)

if (expression)

测试它expression求值为true这是一个布尔值。它适用于指针,因为nullptr / NULL / 0评估为false,其他所有内容true。出于同样的原因,它适用于整数值。

对于某个对象,它属于operator bool(),请参阅http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

  

检查流是否没有错误。

     

1)如果fail()返回true,则返回空指针,否则返回非空指针。该指针可以隐式转换为bool,可以在布尔上下文中使用。

     

2)如果流没有错误并且已准备好进行I / O操作,则返回true。具体来说,返回!fail()。

     

此运算符可以使用流和函数返回对流的引用作为循环条件,从而产生惯用的C ++输入循环,例如while(stream>> value){...}或while(getline( stream,string)){...}。

     

仅当输入操作成功时,此类循环才会执行循环体。

答案 1 :(得分:2)

operator bool() 
如果流没有错误,

返回,否则返回false。

no error ”概念与之前在流本身上完成的操作有关。

例如:在调用构造函数

之后
std::ifstream is ("test.txt", std::ifstream::binary);

设置流对象中的内部状态标志。因此,当您调用运算符 bool 时,检查构造操作是否失败。

此外,方法

is.read(...)

还设置此内部状态标记,如reference

中所示
  

通过修改内部状态标志来发出错误信号: eofbit failbit badbit

因此,在方法调用之后,如果流到达EOF(文件结束),则设置状态位,并且操作符bool将返回正值。

这意味着在那种情况下使用

测试流
if (is) { ... }

并且状态位置位,然后将验证条件并且将采用if分支。

答案 2 :(得分:1)

std::istream已将运营商声明为: explicit operator bool() const;

当你写作 if(SomeStdIstremObject) { ... }确实在调用if(SomeStdIstreamObject.operator bool())而不是检查非零