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 sem mecanistmo de tratamento de exceção
- #include <stdio.h>
- #include <stdlib.h>
- // protótipos
- FILE* abreArquivo(char *nome);
- int leNumeroInteiroPositivo(FILE *fp);
- int converte(char* s);
- int fechaArquivo(FILE* fp);
- // retorna 0 se execução bem sucedida, 1 se houve erro
- int main() {
- FILE *fp = abreArquivo("numeros.txt");
- if(fp == NULL) {
- printf("\nerro na abertura do arquivo");
- return 1;
- }
- int num, soma = 0, flagErro = 0;
- while((num = leNumeroInteiroPositivo(fp)) != EOF) {
- if(num == -2) { // -1 já é usado pelo EOF
- printf("\nerro na leitura do arquivo");
- return 1;
- }
- else if(num == -3) {
- printf("\nerro na leitura de numero inteiro positivo");
- return 1;
- }
- printf("+%d",num);
- soma += num;
- }
- printf("=%d", soma);
- if(fechaArquivo(fp) == 0) {
- printf("\nerro no fechamento de arquivo");
- return 1;
- }
- return 0; // 0 = execução bem sucedida
- }
- // abre um arquivo
- FILE* abreArquivo(char *nome) {
- FILE* fp;
- if((fp = fopen(nome,"r")) == 0)
- return NULL;
- 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
- return -2;
- 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)
- return -3;
- // procura caracteres inválidos (só aceita dígitos e salto de linha)
- while(*s != '\0') {
- if(*s != '\n' && *s != '\r' && (*s < '0' || *s > '9'))
- return -3;
- s++;
- }
- return num;
- }
- // fecha um arquivo
- int fechaArquivo(FILE* fp) {
- if(fclose(fp) != 0)
- return 0;
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement