Advertisement
hmcristovao

Cap 8 - Exceções - exemplo com mecanismo de trat de exceções

Feb 19th, 2013
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.26 KB | None | 0 0
  1. // Le e exibe números inteiros positivos de um arquivo texto,
  2. // calcula e exiba a soma
  3. // versão com mecanismo de tratamento de exceção
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. // classes de erro
  9. class ErroAberturaArquivo {};
  10. class ErroLeituraArquivo {};
  11. class ErroNumeroInteiroPositivo {};
  12. class ErroFechamentoArquivo {};
  13.  
  14. // protótipos
  15. FILE* abreArquivo(char *nome);
  16. int leNumeroInteiroPositivo(FILE *fp);
  17. int converte(char* s);
  18. void fechaArquivo(FILE* fp);
  19.  
  20. // retorna 0 se execução bem sucedida, 1 se houve erro
  21. int main() {
  22.    try {
  23.       FILE *fp = abreArquivo("numeros.txt");
  24.       int num, soma = 0;
  25.       while((num = leNumeroInteiroPositivo(fp)) != EOF) {
  26.          printf("+%d",num);
  27.          soma += num;
  28.       }
  29.       printf("=%d", soma);
  30.       fechaArquivo(fp);
  31.       return 0;
  32.    }
  33.    catch(ErroAberturaArquivo) {
  34.       printf("\nerro na abertura do arquivo");
  35.    }    
  36.    catch(ErroLeituraArquivo) {
  37.       printf("\nerro na leitura do arquivo");
  38.    }    
  39.    catch(ErroNumeroInteiroPositivo) {
  40.       printf("\nerro na leitura de numero inteiro positivo");
  41.    }    
  42.    catch(ErroFechamentoArquivo) {
  43.       printf("\nerro no fechamento de arquivo");
  44.    }  
  45.    return 1;
  46. }
  47.  
  48. // abre um arquivo
  49. FILE* abreArquivo(char *nome) {
  50.    FILE* fp;
  51.    if((fp = fopen(nome,"r")) == 0)
  52.       throw ErroAberturaArquivo();
  53.    return fp;
  54. }
  55.  
  56. // le um número inteiro positivo do arquivo
  57. int leNumeroInteiroPositivo(FILE *fp) {
  58.    char s[10];
  59.    // fgets devolve string + \n + \0.
  60.    // devolve zero se fim de arquivo ou erro na leitura
  61.    if(fgets(s,10,fp) == NULL)
  62.       if(feof(fp) != 0)
  63.          return EOF;
  64.       else
  65.          throw ErroLeituraArquivo();
  66.    int n = converte(s);
  67.    return n;
  68. }  
  69.  
  70. // converte uma string para um número inteiro positivo
  71. int converte(char* s) {
  72.    int num = atoi(s);
  73.    if(num == 0)
  74.       throw ErroNumeroInteiroPositivo();
  75.    // procura caracteres inválidos (só aceita dígitos e salto de linha)
  76.    while(*s != '\0') {
  77.       if(*s != '\n' && *s != '\r' && (*s < '0' || *s > '9'))
  78.          throw ErroNumeroInteiroPositivo();
  79.       s++;
  80.    }
  81.    return num;
  82. }          
  83.  
  84. // fecha um arquivo
  85. void fechaArquivo(FILE* fp) {
  86.    if(fclose(fp) != 0)
  87.       throw ErroFechamentoArquivo();
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement