2016-08-08 2 views
0

Когда я использую объект std :: istream (в примере ниже из cplusplus.com, std :: ifstream) в тесте: «if (myistreamobject)», объект, который автоматически выделяется в стек никогда не является нулевым, верно? ... в приведенном ниже примере мы используем тот же тест, чтобы проверить, были ли все байты прочитаны из файла ... и это действительно странный код, я обычно использую этот стиль, когда Я имею дело с указателями ...тестирование объекта istream

Я хочу знать, какой механизм используется в std :: istream, чтобы вернуть значение в тестах и ​​что это значение действительно означает ... (успех/сбой последнего операция?) является ли это перегрузкой bool cast (например, оператор const char *, приводимый в MFC-классе CString), или это другой метод?

Потому что объект никогда не имеет значения null, поэтому сдавать его в тест всегда будет возвращать true.

// 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; 
} 
+1

Прочтите здесь, пожалуйста: http://ru.cppreference.com/w/cpp/io/basic_ios/operator_bool –

+0

Спасибо, я искал в google и на cplusplus.com, но я не нашел значимых результатов. – Aminos

+1

Вам лучше использовать ссылку, связанную мной. cplusplus.com известен недостатками и неправильной или отсутствующей информацией. –

ответ

2

The

operator bool() 

возвращает верно, если поток не имеет ошибок, false o therwise.

«no error» Концепция - это нечто, связанное с предыдущей операцией, выполненной над потоком.

Например: после вызова конструктора

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

Флаг внутреннего состояния в объекте потока устанавливается. Поэтому, когда вы вызываете оператора bool, вы проверяете, не работает ли операция строительства или нет.

Кроме того, метод

is.read(...) 

также установить этот флаг внутреннего состояния, как вы можете видеть в reference:

ошибки сигнализируют путем изменения внутреннего состояния флагов: eofbit, failbit, badbit.

Итак, после вызова метода, если поток достигнет EOF (конец файла), бит состояния установлен, а оператор bool вернет положительное значение.

Это означает, что в том случае, когда вы испытываете поток с

if (is) { ... } 

и бит состояния установлен, то условие будет проверено и будет принято, если Гиса.

+1

Отличное объяснение! Благодаря ! – Aminos

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) Возвращает true, если поток не имеет ошибок и готов к операциям ввода-вывода. В частности, возвращает! Fail().

Этот оператор позволяет использовать потоки и функции, которые возвращают ссылки на потоки как условия цикла, приводящие к идиоматическим входным петлям C++, таким как while (stream >> value) {...} или while (getline (stream , string)) {...}.

Такие циклы выполняют тело цикла только в том случае, если операция ввода выполнена успешно.

+0

Отличное объяснение тоже. Спасибо. – Aminos

1

std::istream имеет оператор объявил право это: explicit operator bool() const;

Когда вы пишете if(SomeStdIstremObject) { ... } действительно звонит if(SomeStdIstreamObject.operator bool()) не проверяя, не нулевой

Смежные вопросы