Advertisement
hmcristovao

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

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