BUSCAR
INDICE
INDICE DEL TEMA
OBJETIVOS
TEORIA
PALABRAS RESERVADAS
GLOSARIO
EJERCICIOS
RESUELTOS
AUTOEVALUACION
PROPUESTOS
ERRORES
ESTADISTICAS
INICIO
FAQS
LINKS
RECOMIENDANOS
QUIENES SOMOS
MAPA DEL WEB
COLABORAR
Tema 21 Entrada / Salida en C++
Teoría: Errores de Entrada / Salida

Al leer y escribir de ficheros es frecuente que se produzcan errores, como por ejemplo no encontrar el fichero o no poderlo abrir, o al menos situaciones de excepción, tales como el haber llegado al fin del fichero. Es importante saber cómo se pueden detectar estas situaciones con C++.

La clase ios define una variable enum llamada io_state con los siguientes valores: goodbit, eofbit, badbit y failbit. Cada flujo de entrada/salida mantiene información sobre los errores que se hayan podido producir. Esta información se puede chequear con las siguientes funciones:

int good (); devuelve un valor distinto de cero (true) si no ha habido errores (si todos los bits de error están en off).

int eof(); devuelve un valor distinto de cero si se ha llegado al fin del fichero.

int bad(); devuelve un valor distinto de cero si ha habido un error de E/S serio. No se puede continuar en esas condiciones.

int fail(); devuelve un valor distinto de cero si ha habido cualquier error de E/S distinto de EOF. Si una llamada a bad() devuelve 0 (no error de ese tipo), el error puede no ser grave y la lectura puede proseguir después de llamar a la función clear().

int clear(); se borran los bits de error que pueda haber activados.

Además, tanto los operadores sobrecargados (<< y >>) como las funciones miembro de E/S devuelven referencias al flujo correspondiente y esta referencia puede chequearse con un if o en la condición de un while para saber si se ha producido un error o una condición de fin de fichero. Por ejemplo, las siguientes construcciones pueden utilizarse en C++:

while (cin.get(ch)) {

s[i++]=ch;

}

o bien, de una forma distinta,

while (cin << ch) {

s[i++]=ch;

}

ya que si el valor de retorno de (cin.get(ch)) o de (cin<<ch) no es nulo, es que no se ha producido error ni se ha llegado al fin de fichero.

Si lo que se quiere comprobar es si se ha llegado al final del fichero se puede comprobar la condición,

if (cin.get(ch).eof()) {

// se ha llegado al final del fichero

}

y si por el contrario lo que se desea es hacer algo si no se ha tenido ningún error, se puede utilizar el operador negación (¡) que devuelve un resultado distinto de cero (true) si failbit o badbit están activados.

if (¡cin.get(ch)) {

// hay un error de tipo failbit o badbit.

}

El operador negación se puede utilizar también en la forma siguiente, para saber si un fichero se ha podido abrir correctamente:

ifstream filein("datos.d");
if (¡filein) {

cerr << "no se ha podido abrir el fichero." << endl;
exit(1);

}