Título:Fechando Arquivos Automaticamente
Linguagem:C/C++
S.O.:DOS/Windows
Autor(es):Wenderson Teixeira


Fechando Arquivos Automaticamente

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <process.h>

// Função que será registrada por atexit
void cleanup(void
{
    // Fecha todos os arquivos abertos
    fcloseall();
    
    // Imprime mensagem e espera uma tecla para demostrar que a função foi chamada
    puts("Clean Up Method");
    getch();
}

int main(void)
{
    int c;

    // Registrar a função cleanup, que será chamada quando o programa terminar
    atexit(cleanup);

    // Abre o mesmo arquivo diversas vezes e não se preocupa em fechá-lo
    for(c = 0; c < 150; c++)
        if(!fopen("cleanup.obj", "rb"))
        {
            // Se houver erro, imprime uma mensagem e retorna 1 para o processo chamador
            puts("Erro ao abrir cleanup.obj");
            return 1;
        }

    // Sai, retornando 0, para indicar que não houve erros
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

// Classe que fecha automaticamente o arquivo quando o objeto é apagado
class TAutoCloseFile {
private:
    FILE *fp;

public:
    TAutoCloseFile(const char *szFilename, const char *szMode = "r")
    {
        // abre o arquivo e verifica erro
        fp = fopen(szFilename, szMode);
        if(fp == NULL)
            ErrorMessage(szFilename);
    }

    ~TAutoCloseFile()
    {
        // se o arquivo foi aberto, deve ser fechado
        if(fp)
            fclose(fp);
    }

    virtual void ErrorMessage(const char *szFilename)
    {
        // imprime mensagem de erro e termina o programa.
        //   esta função pode ser modificada ou mesmo instanciada 
        //   para funcionar em plataformas diferentes do DOS
        printf("Erro ao abrir %s\n", szFilename);
        exit(1);
    }

    operator FILE *()
    {
        // operador que retorna um FILE *, para uso com as funções normais de arquivo
        return fp;
    }
};


int main()
{
    char *str = new char[256];

    // Mostra a utilização de forma dinâmica
    TAutoCloseFile *config = new TAutoCloseFile("c:\\config.sys");
    printf("-------------------------[ Config.sys ]-------------------------\n");
    while(!feof((FILE *)*config))
    {
        if(fgets(str, sizeof(char) * 256, *config))
            printf(str);
    }
    // Não se esquece sempre de deletar o objeto
    delete config;
    printf("---------------------[ Fim do Config.sys ]----------------------\n\n");

    // Mostra a utilização de forma estática, onde o objeto não precisa ser apagado
    TAutoCloseFile autoexec("c:\\autoexec.bat");
    printf("------------------------[ Autoexec.bat ]------------------------\n");
    while(!feof((FILE *)autoexec))
    {
        if(fgets(str, sizeof(char) * 256, autoexec))
            printf(str);
    }
    printf("--------------------[ Fim do Autoexec.bat ]---------------------\n\n");

    delete str;

    return 0;
}



1