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);
}
|