测试 istream 对象
testing an istream object
当我在测试中使用 std::istream 对象(在下面的示例中来自 cplusplus.com,std::ifstream)时:"if (myistreamobject)",该对象会自动分配在堆栈中的永远不会为空,对吗?...在下面的示例中,我们使用相同的测试来检查是否从文件中读取了所有字节...这真是一个奇怪的代码,我通常使用这种风格当我处理指针时...
我想知道在std::istream到return测试中使用了哪种机制,以及该值的真正含义...(最后一个操作的success/failure ??) 是 bool 转换的重载(就像 MFC class CString 中的 const char* 运算符转换)还是另一种技术?
因为对象永远不会为 null,所以将其放入测试中将始终 return 为真。
// read a file into memory
#include <iostream> // std::cout
#include <fstream> // std::ifstream
int main () {
std::ifstream is ("test.txt", std::ifstream::binary);
if (is) {
// get length of file:
is.seekg (0, is.end);
int length = is.tellg();
is.seekg (0, is.beg);
char * buffer = new char [length];
std::cout << "Reading " << length << " characters... ";
// read data as a block:
is.read (buffer,length);
if (is) // <== this is really odd
std::cout << "all characters read successfully.";
else
std::cout << "error: only " << is.gcount() << " could be read";
is.close();
// ...buffer contains the entire file...
delete[] buffer;
}
return 0;
}
if (expression)
对其进行测试 expression
计算结果为 true
,这是一个布尔值。它适用于指针,因为 nullptr
/NULL
/0
的计算结果为 false
,而其他一切为 true
。出于同样的原因,它适用于整数值。
一个对象,落到operator bool()
,见http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool。
Checks whether the stream has no errors.
1) Returns a null pointer if fail() returns true, otherwise returns a non-null pointer. This pointer is implicitly convertible to bool and may be used in boolean contexts.
2) Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail().
This operator makes it possible to use streams and functions that return references to streams as loop conditions, resulting in the idiomatic C++ input loops such as while(stream >> value) {...} or while(getline(stream, string)){...}.
Such loops execute the loop's body only if the input operation succeeded.
std::istream
已将运算符声明为正确的:
explicit operator bool() const;
写的时候
if(SomeStdIstremObject) { ... }
确实在调用 if(SomeStdIstreamObject.operator bool())
不检查非零
operator bool()
returns 如果流没有错误则为真,否则为假。
“无错误”概念与之前对流本身进行的操作有关。
例如:调用构造函数后
std::ifstream is ("test.txt", std::ifstream::binary);
设置了流对象中的内部状态标志。因此,当您调用运算符 bool 时,您会检查构造操作是否失败。
还有方法
is.read(...)
也设置这个内部状态标志,正如你在 reference:
中看到的
Errors are signaled by modifying the internal state flags: eofbit, failbit, badbit.
因此在方法调用之后,如果流到达 EOF(文件末尾),则设置状态位,并且运算符 bool 将 return 为正值。
这意味着在那种情况下,当您使用
测试流时
if (is) { ... }
并且设置了状态位,然后将验证条件并采用 if 分支。
当我在测试中使用 std::istream 对象(在下面的示例中来自 cplusplus.com,std::ifstream)时:"if (myistreamobject)",该对象会自动分配在堆栈中的永远不会为空,对吗?...在下面的示例中,我们使用相同的测试来检查是否从文件中读取了所有字节...这真是一个奇怪的代码,我通常使用这种风格当我处理指针时...
我想知道在std::istream到return测试中使用了哪种机制,以及该值的真正含义...(最后一个操作的success/failure ??) 是 bool 转换的重载(就像 MFC class CString 中的 const char* 运算符转换)还是另一种技术?
因为对象永远不会为 null,所以将其放入测试中将始终 return 为真。
// read a file into memory
#include <iostream> // std::cout
#include <fstream> // std::ifstream
int main () {
std::ifstream is ("test.txt", std::ifstream::binary);
if (is) {
// get length of file:
is.seekg (0, is.end);
int length = is.tellg();
is.seekg (0, is.beg);
char * buffer = new char [length];
std::cout << "Reading " << length << " characters... ";
// read data as a block:
is.read (buffer,length);
if (is) // <== this is really odd
std::cout << "all characters read successfully.";
else
std::cout << "error: only " << is.gcount() << " could be read";
is.close();
// ...buffer contains the entire file...
delete[] buffer;
}
return 0;
}
if (expression)
对其进行测试 expression
计算结果为 true
,这是一个布尔值。它适用于指针,因为 nullptr
/NULL
/0
的计算结果为 false
,而其他一切为 true
。出于同样的原因,它适用于整数值。
一个对象,落到operator bool()
,见http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool。
Checks whether the stream has no errors.
1) Returns a null pointer if fail() returns true, otherwise returns a non-null pointer. This pointer is implicitly convertible to bool and may be used in boolean contexts.
2) Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail().
This operator makes it possible to use streams and functions that return references to streams as loop conditions, resulting in the idiomatic C++ input loops such as while(stream >> value) {...} or while(getline(stream, string)){...}.
Such loops execute the loop's body only if the input operation succeeded.
std::istream
已将运算符声明为正确的:
explicit operator bool() const;
写的时候
if(SomeStdIstremObject) { ... }
确实在调用 if(SomeStdIstreamObject.operator bool())
不检查非零
operator bool()
returns 如果流没有错误则为真,否则为假。
“无错误”概念与之前对流本身进行的操作有关。
例如:调用构造函数后
std::ifstream is ("test.txt", std::ifstream::binary);
设置了流对象中的内部状态标志。因此,当您调用运算符 bool 时,您会检查构造操作是否失败。
还有方法
is.read(...)
也设置这个内部状态标志,正如你在 reference:
中看到的Errors are signaled by modifying the internal state flags: eofbit, failbit, badbit.
因此在方法调用之后,如果流到达 EOF(文件末尾),则设置状态位,并且运算符 bool 将 return 为正值。
这意味着在那种情况下,当您使用
测试流时if (is) { ... }
并且设置了状态位,然后将验证条件并采用 if 分支。