Actualmente estoy aprendiendo cómo funciona while (cin >> num) y descubrí que hay dos pasos. La primera es la función operator>> que devuelve un objeto istream con estado de error, y la segunda es el convertidor bool que convierte el objeto istream en bool dependiendo de su estado.
Pero me resulta confuso que en la función de conversión bool, devolverá 0 solo si se establece failbit o badbit. Y la función operator>> establecerá eofbit si lee EOF.
función de conversión bool: https://www.cplusplus.com/reference/ios/ios/operator_bool/
operador>> función: https://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
En este caso, después de ingresar EOF, el convertidor bool debería devolver 1 porque el bit de error y el bit de error no están configurados.
Por lo tanto, uso el siguiente programa para verificar qué sucedió realmente con el bit de error después de ingresar EOF. ¡Y descubro que el failbit se establecerá después de ingresar a EOF!
Entonces, me pregunto si alguien puede ayudarme a entender por qué se establece un error.
#include <iostream> using namespace std; int main() { int num; cin >> num; cout << cin.eof() << " " << cin.fail() << " " << cin.bad() << endl; return 0; }Entrada: ^Z (en Windows usando qt Creator, proyecto no qt c++) Salida: 1 1 0
Entrada: ^D (en Windows usando qt Creator, proyecto no qt c++) Salida: 0 1 0
eofbit se establece cuando una operación de lectura encuentra EOF mientras lee datos en el búfer de la secuencia. Los datos aún no han sido procesados.
failbit se establece cuando los datos solicitados no se extraen del búfer, como cuando se lee un número entero con operator>> . Mientras espera que lleguen los dígitos, podría ocurrir EOF. eofbit solo no es suficiente para entrar en un estado de error, ya que puede haber datos utilizables en el búfer.
Entonces, por ejemplo, imagine que se usa un ciclo while (cin >> num) y el usuario ingresa 123<Ctrl-Z> .
en la primera iteración, operator>> lee 1 , 2 , 3 en el búfer, luego encuentra Ctrl-Z, por lo que establece eofbit y deja de leer. 123 luego se extrae del búfer a num y el operador sale. En este punto, la transmisión aún no se encuentra en un estado de error. Cuando la conversión bool de la transmisión es evaluada por while , devuelve verdadero, lo que permite ingresar el cuerpo while para que pueda procesar num .
en la siguiente iteración, operator>> ve que eofbit está configurado, lo que impide una lectura posterior. No queda nada en el búfer para extraer en num , por lo que el operador establece un bit de failbit y sale. La transmisión se encuentra ahora en un estado de error. Cuando la conversión bool de la transmisión es evaluada por while , devuelve falso, rompiendo el bucle while .
Si el EOF es la primera entrada, el operator>> no puede leer un número entero, por lo que la secuencia entra en el estado fail() .
Si escribe al menos un dígito antes de Ctrl-Z, ese dígito se lee y la entrada se realiza correctamente.