quinta-feira, 22 de outubro de 2015

Arquivo - extraindo e salvando coluna

Para criar este programa utilizei pelo menos cinco funções e duas macros
fundamentais para o bom desempenho, que foram as funções:

fseek(); Para posicionar o ponteiro de arquivo num byte específico
fscanf(); É para o arquivo o que scanf é para o console
putc(); Escreve um caracter em um arquivo
fgets(); pega uma linha inteira de um arquivo
feof();retorna verdadeiro se o final de arquivo foi atingido;

E as macros: SEEK_SET, SEEK_CUR.
Estas funções e estas macros estão no arquivo de cabeçalho stdio.h.
Estas macros trabalham como parâmetros na função fseek(); e são
perfeitas para posicionamentos, isto é, acesso aleatórios de dados.

SEEK_SET ==> Marca um início no arquivo
SEEK_CUR ==> Ponto corrente no arquivo
SEEK_END ==> Não foi utilizado neste programa,
marca o fim do arquivo.

A lógica para posicionar a leitura no início dos nomes das candidatas
foi um pouco confusa, note que estes nomes começam na linha seis do arquivo,
que começa em zero ( 0 ) e segue até a linha quinze ( 15 ).
Então, calculei o tamanho do arquivo e a posição de início dos nomes
como já citei acima, e coloquei como condição dentro de um laço while();
A cada ciclo do while(); a variável de controle é incrementada e um novo
valor é adicionado, este valor, corresponde ao total de caracteres de cada linha
contando com espaços, que obviamente o ciclo pula para a linha mais abaixo,
até que o arquivo chegue em sua última linha.
Más isto tudo foi porque teimei em fazer esta leitura da coluna dos nomes com fscanf();
Com fgets(); isto teria sido bem mais simples.
Um novo arquivo é criado, e recebe escritas dos caracteres dos nomes
com a função putc(); agora o arquivo é fechado e aberto novamente como leitura.
Esta foi uma breve descrição do funcionamento deste programa, que é indicado
a estudantes mais avançados em c.

Veja abaixo imagens do programa em execução:




Veja abaixo o código do programa:


#include <conio.h>
#include <stdio.h>
void Janela ( ) {
     int lin, col;
     for ( lin = 1; lin <= 26 ; lin++ ) {
         for ( col = 1; col <= 80 ; col++ ) {
              gotoxy ( col , lin );
              if ( lin == 2 ) {
                   textattr ( 200 );
                   printf ( " " );
              }
              if ( col == 1 ) {
                   textattr ( 200 );
                   printf ( " " );
              }
              if ( col == 80 ) {
                   textattr ( 200 );
                   printf ( " " );
              }
         }
     }
}
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 ( ) {
     system ( "title ARQUIVO - EXTRAINDO E SALVANDO COLUNA" );
     char *vet;
     vet = ( char* ) malloc ( 100 * sizeof(char) );
     char nomes [ 11 ] [ 17 ];
     int i, j, l, r = 165;
     FILE *fp;
     if ( ( fp = fopen (
              "C:\\Users\\Lima 32 SP1\\Desktop\\Arquivos\\arquivo.txt" , "w" ) )
              == NULL ) {
         printf ( "Houve um erro na abertura do arquivo" );
         getche ( );
         exit ( 1 );
     }
     FILE *arq;
     if ( ( arq =
              fopen (
                        "C:\\Users\\Lima 32 SP1\\Desktop\\Arquivos\\Concurso Belas da informática.txt" ,
                        "r" ) ) == NULL ) {
         printf ( "Houve um erro na abertura do arquivo" );
         getche ( );
         exit ( 1 );
     }
     textcolor ( LIGHTRED );
     gotoxy ( 23 , 4 );
     printf ( "ARQUIVO - EXTRAINDO E SALVANDO COLUNA" );
     textbackground ( BLACK );
     textcolor ( WHITE );
     gotoxy ( 1 , 6 );
     for ( i = 0; i < 17 ; i++ ) {
         fseek ( arq , 0 , SEEK_CUR );
         for ( j = 1; j < 51 ; j++ ) {
              fscanf ( arq , "%c" , &nomes [ i ] [ j ] );
              printf ( "%c" , nomes [ i ] [ j ] );
         }
     }
     textcolor ( LIGHTRED );
     gotoxy ( 31 , 23 );
     printf ( "PRESSIONE QUALQUER TECLA" );
     Janela ( );
     getche ( );
     system ( "cls" );
     Moldura ( 2 , 24 , 2 , 78 , 2 , 3 );
     i = 0;
     r = 165;
     l = 15;
     textcolor ( LIGHTRED );
     gotoxy ( 23 , 4 );
     printf ( "ARQUIVO - EXTRAINDO E SALVANDO COLUNA" );
     textcolor ( LIGHTBLUE );
     gotoxy ( 11 , 6 );
     printf ( "COLUNA EXTRAIDA" );
     textcolor ( BLACK );
     gotoxy ( 10 , 8 );
     while ( r < 844 ) {
         r = r + 65;
         fseek ( arq , r , SEEK_SET );
         for ( j = 0; j < 17 ; j++ ) {
              fscanf ( arq , "%c" , &vet [ i ] );
              printf ( "%c" , vet [ i ] );
              putc ( vet [ i ] , fp );
         }
         gotoxy ( 10 , l - 6 );
         l++;
     }
     fclose ( fp );
     Sleep ( 1800 );
     if ( ( fp = fopen (
              "C:\\Users\\Lima 32 SP1\\Desktop\\Arquivos\\arquivo.txt" , "r" ) )
              == NULL ) {
         printf ( "Houve um erro na abertura do arquivo" );
         getche ( );
         exit ( 1 );
     }
     while ( feof ( fp ) == 0 ) {
         fgets ( nomes [ i ] , 200 , fp );
         ++i;
     }
     fclose ( fp );
     textcolor ( LIGHTBLUE );
     gotoxy ( 47 , 6 );
     printf ( "COLUNA SALVA" );
     textcolor ( BLACK );
     for ( i = 0; i < 11 ; i++ ) {
         gotoxy ( 45 , i + 8 );
         for ( j = 0; j < 16 ; j++ ) {
              printf ( "%c" , nomes [ i ] [ j ] );
         }
     }
     Sleep ( 1800 );
     textcolor ( LIGHTBLUE );
     gotoxy ( 17 , 19 );
     printf ( "Por: " );
     textcolor ( LIGHTMAGENTA );
     printf ( "Samuel Lima" );
     textcolor ( BLACK );
     gotoxy ( 17 , 21 );
     printf ( "sa_sp10@hotmail.com" );
     Sleep ( 1800 );
     textcolor ( LIGHTRED );
     gotoxy ( 36 , 23 );
     printf ( "MUITO OBRIGADO" );
     getch ( );
     exit ( 0 );
     getche ( );
     free ( vet );
     return 0;
}

Nenhum comentário:

Postar um comentário

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