Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Le e exibe números inteiros positivos de um arquivo texto,
- // calcula e exiba a soma
- // versão com mecanismo de tratamento de exceção
- #include <stdio.h>
- #include <stdlib.h>
- // classes de erro
- class ErroAberturaArquivo {};
- class ErroLeituraArquivo {};
- class ErroNumeroInteiroPositivo {};
- class ErroFechamentoArquivo {};
- // protótipos
- FILE* abreArquivo(char *nome);
- int leNumeroInteiroPositivo(FILE *fp);
- int converte(char* s);
- void fechaArquivo(FILE* fp);
- // retorna 0 se execução bem sucedida, 1 se houve erro
- int main() {
- try {
- FILE *fp = abreArquivo("numeros.txt");
- int num, soma = 0;
- while((num = leNumeroInteiroPositivo(fp)) != EOF) {
- printf("+%d",num);
- soma += num;
- }
- printf("=%d", soma);
- fechaArquivo(fp);
- return 0;
- }
- catch(ErroAberturaArquivo) {
- printf("\nerro na abertura do arquivo");
- }
- catch(ErroLeituraArquivo) {
- printf("\nerro na leitura do arquivo");
- }
- catch(ErroNumeroInteiroPositivo) {
- printf("\nerro na leitura de numero inteiro positivo");
- }
- catch(ErroFechamentoArquivo) {
- printf("\nerro no fechamento de arquivo");
- }
- return 1;
- }
- // abre um arquivo
- FILE* abreArquivo(char *nome) {
- FILE* fp;
- if((fp = fopen(nome,"r")) == 0)
- throw ErroAberturaArquivo();
- return fp;
- }
- // le um número inteiro positivo do arquivo
- int leNumeroInteiroPositivo(FILE *fp) {
- char s[10];
- // fgets devolve string + \n + \0.
- // devolve zero se fim de arquivo ou erro na leitura
- if(fgets(s,10,fp) == NULL)
- if(feof(fp) != 0)
- return EOF;
- else
- throw ErroLeituraArquivo();
- int n = converte(s);
- return n;
- }
- // converte uma string para um número inteiro positivo
- int converte(char* s) {
- int num = atoi(s);
- if(num == 0)
- throw ErroNumeroInteiroPositivo();
- // procura caracteres inválidos (só aceita dígitos e salto de linha)
- while(*s != '\0') {
- if(*s != '\n' && *s != '\r' && (*s < '0' || *s > '9'))
- throw ErroNumeroInteiroPositivo();
- s++;
- }
- return num;
- }
- // fecha um arquivo
- void fechaArquivo(FILE* fp) {
- if(fclose(fp) != 0)
- throw ErroFechamentoArquivo();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement