quinta-feira, 19 de maio de 2016

Arquivo - formato específico com fscanf

Se já estamos acostumados a ler de forma
formatada com scanf(); não estamos muito longe
de entender como ler de modo idêntico com fscanf();
Ora, estudantes de linguagem C devem achar isto perfeito,
possível e necessário em alguns casos.
A função fscanf() funciona como a função scanf(). 
A diferença é que a entrada de fscanf() é um arquivo
e não o teclado do computador.
Abaixo está a síntaxe para fscanf();:
int fscanf (FILE *fp,char *str,...);
Como já acredito que você conhece a síntaxe de scanf();
 imagino que você já detectou que a única diferença das duas
é a especificação do arquivo destino através do ponteiro de arquivo.
Alguns programadores não recomendam o uso de fprintf(); 
e fscanf(); para ler e escrever dados em arquivos, 
pois trabalham com dados ASCII e não binários
o que ocasiona uma perda de desempenho no programa
dando preferência o uso de fread e fwrite.
Uma boa dica para uma leitura formatada com sucesso
é fazer uma análise no arquivo primeiro e procurar
estabelecer um determinado padrão se não houver.
Note que no nosso arquivo lendo da esquerda para direita
temos na primeira coluna nomes com sobrenomes de pessoas, 
na seguinte dia de nascimento, na próxima mês de nascimento, 
na seguinte o ano de nascimento, na coluna de origem
leitura de strings referente à nacionalidade,
e nas próximas colunas, são pesos e altura de cada um, 
onde é óbvio que usamos floats para ler isto.
Exemplo mais claro que este que mostro agora
acho impossível de encontrar, portanto o iniciante
de linguagem C deve ficar satisfeito com tudo isto
que é apresentado agora e com clareza.

Veja abaixo uma imagem do programa em execução:


Abaixo os dados passados no arquivo usado pelo programa

Rubens Souza    02   10     1970   Brasileira       76.7   1.72
Neusa Rios        17    04    1982   Portuguesa      65.8   1.67
Sandro Ivo        12     03    1975   Brasileira       70.2   1.70
Damião Alves   23     01    1980   Argentina       59.9   1.65
Márcio Sá         05     08    1977   Madagascar    75.6   1.78
Mary James      14     11    1989   Peru                83.7   1.84
Ivete Cruz         18     09    1986   Polônia           61.3   1.69
Márcia Ramos   21    12    1990   Luxemburgo   57.1   1.64
Samuel Lima     21    02    1970   Brasileira        69.4   1.72
Cláudia Castro  16    07    1985   Brasileira         58.5   1.63
                                                       


Veja abaixo o código do programa:



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void Moldura ( int a, int c, int b, int d, int e, int f ) {
     textbackground ( WHITE );
     for ( a = e; a <= c; a++ )
         for ( b = f; b <= d; b++ ) {
              gotoxy ( b, a );
              textbackground ( WHITE );
              printf ( " " );
         }
}
int main ( ) {
     Moldura ( 2, 24, 2, 78, 2, 3 );
     system ( "title ARQUIVO - FORMATO ESPECÍFICO COM FSCANF" );
     FILE *arq;
     int k;
     char nome [ 20 ];
     char Snome [ 20 ];
     char org [ 20 ];
     float peso;
     float alt;
     int dia;
     int mes;
     int ano;
     if ( ( arq = fopen ( "C:\\Users\\SAMUEL 64SP1\\Desktop\\"
              "Arquivos\\Cidadão II.txt", "r" ) ) == NULL ) {
         printf ( "Houve um erro na abertura do arquivo" );
         getche ( );
         exit ( 1 );
     }
     textcolor ( LIGHTRED );
     gotoxy ( 23, 4 );
     printf ( "ARQUIVO - FORMATO ESPECÍFICO COM FSCANF" );
     textcolor ( LIGHTBLUE );
     gotoxy ( 21, 6 );
     printf ( "Abaixo os dados que foram lidos do arquivo" );
     textcolor ( LIGHTRED );
     gotoxy ( 9, 8 );
     printf (
              " Nome         Dia    Mês    Ano       Origem       Peso    Altura" );
     k = 0;
     while ( k < 10 ) {
         k++;
         fscanf ( arq, "%s %s", nome, Snome );
         fscanf ( arq, "%d", &dia );
         fscanf ( arq, "%d", &mes );
         fscanf ( arq, "%d", &ano );
         fscanf ( arq, "%s", org );
         fscanf ( arq, "%f", &peso );
         fscanf ( arq, "%f", &alt );
         textbackground ( WHITE );
         textcolor ( BLACK );
         gotoxy ( 6, k + 9 );
         printf ( "%s %s", nome, Snome );
         textcolor ( LIGHTBLUE );
         gotoxy ( 24, k + 9 );
         printf ( "%d", dia );
         gotoxy ( 30, k + 9 );
         printf ( "%d", mes );
         gotoxy ( 36, k + 9 );
         printf ( "%d", ano );
         textcolor ( BLACK );
         gotoxy ( 45, k + 9 );
         printf ( "%s", org );
         textcolor ( LIGHTMAGENTA );
         gotoxy ( 60, k + 9 );
         printf ( "%.1f", peso );
         gotoxy ( 69, k + 9 );
         printf ( "%.2f", alt );
         normvideo ( );
         Sleep ( 80 );
         if ( k == 10 ) {
              Sleep ( 1800 );
              textbackground ( WHITE );
              textcolor ( LIGHTBLUE );
              gotoxy ( 17, 21 );
              printf ( "Por: " );
              textcolor ( LIGHTMAGENTA );
              printf ( "Samuel Lima" );
              textcolor ( BLACK );
              gotoxy ( 17, 22 );
              printf ( "sa_sp10@hotmail.com" );
              Sleep ( 1800 );
              textcolor ( LIGHTRED );
              gotoxy ( 36, 23 );
              printf ( "MUITO OBRIGADO" );
              getch ( );
              exit ( 0 );
         }
     }
     fclose ( arq );
     return 0;
}




Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.