You can use the isprint()
function of the standard ctype.h
library to test whether a character is printable.
The fgets()
function does not remove the \n
from the end of the string read, and fopen()
will fail if the file name has \n
at the end. How about using scanf()
instead of fgets()
to avoid this complication?
See only your rewritten code:
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
int main( void )
{
int i = 0;
int caracteres = 0;
int linhas = 0;
int imprimiveis = 0;
FILE *arquivo = NULL;
char nome[ PATH_MAX + 1 ];
char linha[ PATH_MAX + 1 ];
printf("Escreva o nome do arquivo: ");
scanf( "%s", nome );
arquivo = fopen( nome,"r" );
if( arquivo == NULL )
{
printf("Erro, arquivo '%s' nao existe.\n", nome );
return 1;
}
while( fgets( linha, PATH_MAX, arquivo ) )
{
i = 0;
while( linha[i] )
{
if( isprint(linha[i]) )
imprimiveis++;
i++;
}
caracteres += i;
linhas++;
}
fclose(arquivo);
printf("Caracteres lidos: %d\n", caracteres );
printf("Caracteres imprimiveis lidos: %d\n", imprimiveis );
printf("Numero de linhas lidas: %d\n", linhas );
return 0;
}
Test File ( entrada.txt
):
At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis
praesentium voluptatum deleniti atque corrupti quos dolores et quas
molestias excepturi sint occaecati cupiditate non provident, similique
sunt in culpa qui officia deserunt mollitia animi, id est laborum et
dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio.
Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil
impedit quo minus id quod maxime placeat facere possimus, omnis voluptas
assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et
aut officiis debitis aut rerum necessitatibus saepe eveniet ut et
voluptates repudiandae sint et molestiae non recusandae. Itaque earum
rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus
maiores alias consequatur aut perferendis doloribus asperiores repellat.
Output:
Escreva o nome do arquivo: entrada.txt
Caracteres lidos: 844
Caracteres imprimiveis lidos: 833
Numero de linhas lidas: 12