Gestión de errores en c ++ al abrir un archivo
Video: Introducción a la programación en C/C++ - Leer y escribir en un archivo binario (acceso directo)
Al abrir un archivo, todo tipo de cosas pueden ir mal. Un archivo reside en un dispositivo físico - un disco fijo, por ejemplo, o tal vez en una tarjeta SD o una unidad flash - y usted puede tener problemas cuando se trabaja con dispositivos físicos.
Por ejemplo, parte del disco podría estar dañado, causando un archivo existente a corromperse. O, menos desastroso, es posible que se quede sin espacio en disco. O, incluso menos desastroso, es posible que intente abrir un archivo en un directorio que no existe.
Si intenta abrir un archivo para escritura especificando una ruta completa y el nombre, pero no existe el directorio, el equipo responde de manera diferente, dependiendo del sistema operativo que esté utilizando. Si no está seguro de cómo su sistema operativo en particular responderá, intentar escribir una aplicación de prueba sencilla que intenta crear y algo abierto como /abc/def/ghi/jkl/abc.txt. (Por supuesto, usted quiere estar seguro de usar un directorio que no existe.)
Entonces una de dos cosas sucederá: O bien el directorio y el archivo será creado, o no pasará nada.
Por ejemplo, en un sistema Windows, si tratamos de crear un archivo en un directorio que no existe, el sistema no crea el directorio. Eso es porque en el fondo, en última instancia, la aplicación llama a una función del sistema operativo que hace el trabajo sucio de crear el archivo. Y esta función sistema operativo en particular (se llama Crea un archivo(), incluso si la atención) tiene una regla que no va a crear un directorio para usted.
Si desea determinar si el ostream clase no ha podido crear un archivo, puede llamar a su fallar() función miembro. Esta función devuelve cierto si el objeto no pudo crear el archivo. Y eso es lo que ocurre cuando no existe un directorio. los DirectoryCheck01 ejemplo mostrado demuestra un ejemplo de esto.
#incluir#incluir using namespace std-int main () {archivo_salida ofstream ("/abc/def/ghi/MyFile.txt") -Si (outfile.fail ()) {cout lt; lt; "No se pudo abrir el archivo!" lt; lt; endl retorno 0-} archivo_salida lt; lt; "Hola" lt; lt; endl-outfile.close () - retorno 0-}
Cuando se ejecuta este código, en el supuesto de que usted no tiene un directorio llamado / Abc / def / ghi en su sistema, debería ver el mensaje No se pudo abrir el archivo! Suponiendo que su sistema operativo en particular no crea un directorio en este caso- si lo hace, el equipo se abra el archivo, escribir Hola a ella, y seguir adelante con su vida feliz después de cerrar las cosas.
Como alternativa a llamar a la fallar() función miembro, puede utilizar un operador disponible en varias clases de flujo. Esto es!, Se refirió cariñosamente como el operador “bang”, y que lo utilizaría en lugar de llamar fallar(), como en este código:
if (! archivo_salida) {cout lt; lt; "No se pudo abrir el archivo!" lt; lt; endl retorno 0-}
La mayoría de la gente prefiere usar !archivo_salida en lugar de outfile.fail (), a pesar de que !archivo_salida Hace código confuso. La razón es que archivo_salida es un objeto, y la noción de !archivo_salida simplemente no tiene sentido.
De hecho, !archivo_salida excursiones a muchos programadores principiantes. Ellos saben que archivo_salida no es un puntero en este código de ejemplo, y se preguntan cómo se puede probar contra 0 a medida que normalmente sólo se puede hacer con un puntero. (Recuerde, diciendo !x, dónde x es un poco de puntero, que está probando x en contra 0.) Y que simplemente no tiene sentido! Y así, para evitar confusiones, simplemente llame fallar(). Tiene más sentido.
Aquí hay algunas razones de su creación del archivo puede estrangular:
El directorio no existe.
Video: Manejo de archivos en lenguaje C
Estás fuera de espacio en disco y de suerte.
Su aplicación no tiene los permisos adecuados para crear un archivo.
Video: 8. Eliminar registros - Curso de manejo de archivos en C++
El nombre de archivo no es válido - es decir, que contenía caracteres del sistema operativo no permite un nombre de archivo, como * o?.
Como cualquier buena aplicación, la aplicación debe hacer dos cosas:
1.Comprobar si una creación de archivos tuvo éxito.
2.Si la creación del archivo falló, manejarlo adecuadamente.
No se limite a imprimir un mensaje tan horribles como ¡Huy! Abortar!, dejando el pobre usuario sin más remedio que tirar el monitor en el suelo. En su lugar, hacer algo más amigable - tales como la presentación de un mensaje diciéndoles que hay un problema y sugiriendo que podría liberar más espacio en disco.