Manejo de errores durante operaciones con archivos en C/C++

Es bastante común que se produzcan errores al leer datos de un archivo en C++ o al escribir datos en un archivo . Por ejemplo, puede surgir un error debido a lo siguiente:

  • Al intentar leer un archivo más allá del indicador.
  • Al intentar leer un archivo que no existe.
  • Al intentar utilizar un archivo que no ha sido abierto.
  • Al intentar usar un archivo en un modo inapropiado, es decir, escribir datos en un archivo que se ha abierto para leer.
  • Al escribir en un archivo que está protegido contra escritura, es decir, al intentar escribir en un archivo de solo lectura.

Si no se verifican los errores, el programa puede comportarse de manera anormal, por lo tanto, un error no verificado puede provocar la finalización prematura del programa o una salida incorrecta.

A continuación, se muestran algunas funciones de manejo de errores durante las operaciones con archivos en C/C++:

ferror():

En C/C++, la función de biblioteca ferror() se usa para verificar el error en la secuencia. Su prototipo se escribe como:

 int ferror (ARCHIVO *flujo);

La función ferror() comprueba si hay algún error en la secuencia. Devuelve un valor cero si no se ha producido ningún error y un valor distinto de cero si hay un error. La indicación de error durará hasta que se cierre el archivo, a menos que la función clearerr() lo elimine . 

A continuación se muestra el programa para implementar el uso de ferror() :

C

// C program to illustrate the
// use of ferror()
#include <stdio.h>
#include <stdlib.h>
  
// Driver Code
int main()
{
    FILE* fp;
  
    // If a file is opened which does
    // not exist, then it will be an
    // error and corresponding errno
    // value will be set
    char feedback[100];
  
    int i;
    fp = fopen("GeeksForGeeks.TXT", "w");
  
    if (fp == NULL) {
        printf("\n The file could "
               "not be opened");
        exit(1);
    }
  
    printf("\n Provide feedback on "
           "this article: ");
    fgets(feedback, 100, stdin);
  
    for (i = 0; i < feedback[i]; i++)
        fputc(feedback[i], fp);
  
    // Error writing file
    if (ferror(fp)) {
        printf("\n Error writing in file");
        exit(1);
    }
  
    // Close the file pointer
    fclose(fp);
}

C++

// C++ program to illustrate the
// use of ferror()
#include <bits/stdc++.h>
  
// Driver Code
int main()
{
    FILE* fp;
  
    // If a file is opened which does
    // not exist, then it will be an
    // error and corresponding errno
    // value will be set
    char feedback[100];
  
    int i;
    fp = fopen("GeeksForGeeks.TXT", "w");
  
    if (fp == NULL) {
        printf("\n The file could "
               "not be opened");
        exit(1);
    }
  
    printf("\n Provide feedback on "
           "this article: ");
    fgets(feedback, 100, stdin);
  
    for (i = 0; i < feedback[i]; i++)
        fputc(feedback[i], fp);
  
    // Error writing file
    if (ferror(fp)) {
        printf("\n Error writing in file");
        exit(1);
    }
  
    // Close the file pointer
    fclose(fp);
}

Producción:

Explicación: después de ejecutar este código, se mostrará en la pantalla «Proporcionar comentarios sobre este artículo:» y después de dar algunos comentarios, se mostrará en la pantalla «Proceso finalizado después de algunos segundos con valor de retorno 0».

más clear():

La función clearerr() se utiliza para borrar los indicadores de error y fin de archivo de la secuencia. Su prototipo se puede dar como:

void clearerr(ARCHIVO *flujo);

clearerr () borra el error de la secuencia señalada por la secuencia. La función se utiliza porque los indicadores de error no se borran automáticamente. Una vez que se establece el indicador de error para una transmisión específica, las operaciones en la transmisión continúan devolviendo un valor de error hasta que se llama a clearerr() , fseek() , fsetpos() o rewind() .

A continuación se muestra el programa para implementar el uso de clearerr() :

C

// C program to illustrate the
// use of clearerr()
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
  
// Driver Code
int main()
{
    FILE* fp;
    char feedback[100];
  
    char c;
  
    fp = fopen("file.txt", "w");
  
    c = fgetc(fp);
    if (ferror(fp)) {
        printf("Error in reading from"
               " file : file.txt\n");
    }
    clearerr(fp);
  
    if (ferror(fp)) {
        printf("Error in reading from "
               "file : file.txt\n");
    }
  
    // close the file
    fclose(fp);
}

C++

// C++ program to illustrate the
// use of clearerr()
#include <bits/stdc++.h>
  
// Driver Code
int main()
{
    FILE* fp;
    char feedback[100];
  
    char c;
  
    fp = fopen("file.txt", "w");
  
    c = fgetc(fp);
    if (ferror(fp)) {
        printf("Error in reading from"
               " file : file.txt\n");
    }
    clearerr(fp);
  
    if (ferror(fp)) {
        printf("Error in reading from "
               "file : file.txt\n");
    }
  
    // close the file
    fclose(fp);
}

Producción:

La función perror() significa error de impresión. En caso de error, el programador puede determinar el tipo de error que ha ocurrido utilizando la función perror() . Cuando se llama a perror() , muestra un mensaje que describe el error más reciente que ocurrió durante una llamada a una función de biblioteca o una llamada al sistema . Su prototipo se puede dar como:

void perror (char*msg);

  • El perror() toma un argumento que apunta a un mensaje opcional definido por el usuario: el mensaje se imprime primero seguido de dos puntos y el mensaje definido por la implementación que describe el error más reciente.
  • Si se realiza una llamada a perror() cuando en realidad no ha ocurrido ningún error, se mostrará ‘Sin error’.
  • Lo más importante que debe recordar es que una llamada a perror() y no se hace nada para tratar la condición de error, entonces depende totalmente del programa tomar medidas. Por ejemplo, el programa puede solicitar al usuario que haga algo como finalizar el programa.
  • Normalmente, las actividades del programa se determinarán comprobando el valor de errno y la naturaleza del error.
  • Para usar la constante externa errno , debe incluir el archivo de encabezado ERRNO.H

A continuación se muestra el programa que se muestra a continuación que ilustra el uso de perror() . Aquí, suponga que el archivo «archivo.txt» no existe.

C

// C program to illustrate the
// use of perror()
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
  
// Driver Code
int main()
{
    FILE* fp;
  
    // First rename if there is any file
    rename("file.txt", "newfile.txt");
  
    // Now try to open same file
    fp = fopen("file.txt", "r");
  
    if (fp == NULL) {
  
        perror("Error: ");
        return (-1);
    }
  
    // Close the file pointer
    fclose(fp);
  
    return (0);
}

C++

// C++ program to illustrate the
// use of perror()
#include <bits/stdc++.h>
#include <errno.h>
  
// Driver Code
int main()
{
    FILE* fp;
  
    // First rename if there is any file
    rename("file.txt", "newfile.txt");
  
    // Now try to open same file
    fp = fopen("file.txt", "r");
  
    if (fp == NULL) {
  
        perror("Error: ");
        return (-1);
    }
  
    // Close the file pointer
    fclose(fp);
  
    return (0);
}

Producción:

Publicación traducida automáticamente

Artículo escrito por ayushraj2122 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *