Laboratório de Algoritmos – Aula 10C

Manipulação de Arquivos

Streams x Arquivos

Uma stream é um dispositivo lógico que representa um arquivo ou dispositivo, sendo que uma stream é independente do arquivo ou dispositivo.

A função que manipula uma stream pode escrever tanto em um arquivo no disco quanto em algum outro dispositivo, como o monitor.

Para utilizar um arquivo você deve associá-lo a uma stream e, então, manipular a stream.

A stream associa o arquivo a uma estrutura do tipo FILE. Esta estrutura é definida no arquivo de cabeçalho stdio.h

Streams

As streams podem ser:

Streams de Texto: É uma sequência de caractere, sendo que alguns caracteres (como quebra de linha por exemplo) podem variar de acordo com o sistema operacional utilizado. Pode haver tradução de caracteres lidos para os dispositivos onde os dados serão exibidos.

Streams Binárias: Sequência de bytes com uma correspondência de um para um com aqueles encontados nos dispositivos externos de forma que não existe tradução de caracteres.

Arquivos

Em C um arquivo pode ser qualquer coisa, desde um arquivo em disco, um terminal ou uma impressora. A associação entre uma stream e um arquivo específico é realizada através de uma operação de abertura específico.

A linguagem C possui diversas funções de tratamento de arquivos, contidas na biblioteca STDIO.H, sendo que existe um padrão de nomenclatura, onde a maioria das funções iniciam com a letra “f”.

Principais funções

FUNÇÃO FINALIDADE
fopen( ) Abrir um arquivo
fclose( ) Fechar um arquivo
putc( ) Escrever um caracter em um arquivo
fputc( ) Idem putc( )
getc( ) Ler um caracter de um arquivo
fgetc( ) Idem getc( )
fseek( ) Posicionar o ponteiro de arquivo num byte específico
fprintf( ) É para o arquivo o que printf é para o console
fscanf( ) É para o arquivo o que scanf é para o console
feof( ) Devolve verdadeiro se o fim do arquivo foi atingido
ferror( ) Devolve verdadeiro se ocorreu um erro
rewind( ) Posicionar o ponteiro de arquivo no início deste
remove( ) Apagar um arquivo
fflush( ) Descarregar um arquivo

Ponteiro de Arquivo

Um ponteiro de arquivo identifica um arquivo específico e é usado pela stream para direcionar as operações das funções de E/S. Um ponteiro de arquivo é uma variável ponteiro do tipo FILE.

Para ler ou escrever em arquivos seu programa precisa usar os ponteiros de arquivo. Para declarar uma variável como ponteiro de arquivo use a seguinte sintaxe:

FILE *arquivo;

Abertura de Arquivos

A função existente para abrir uma stream e associá-la a um arquivo é a fopen( ) ,cuja sintaxe é:

fopen(,)

Existem uma série de tipos de abertura de arquivos, que serão mostradas a seguir.

A função fopen() retorna um ponteiro de arquivo, que nunca deve ter seu valor alterado pelo programa. Se ocorrer algum erro durante a abertura do arquivo, a função fopen() retorna um ponteiro nulo (NULL).

Formas de abertura de um arquivo

MODO COMO O ARQUIVO SERÁ ABERTO
r Abre um arquivo texto para leitura.
w Cria um arquivo texto para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.
a Abre um arquivo texto para anexação.
rb Abre um arquivo binário para leitura.
wb Cria um arquivo binário para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.
ab Abre um arquivo binário para anexação.
r+ Abre um arquivo texto para leitura/escrita.
w+ Cria um arquivo texto para leitura/escrita. Se o arquivo não existir, será criado.
a+ Anexa ou cria um arquivo-texto para leitura/escrita.
r+b Abre um arquivo binário para leitura/escrita.
w+b Cria um arquivo binário para leitura/escrita.
a+b Anexa um arquivo binário para leitura/escrita.

Exemplo de Abertura de Arquivos

#include stdio.h

int main(int argc, char *argv[])
{
    FILE *arq;

    arq = fopen("Arquivo.txt", "rb"); //abre o arquivo

    if (arq == NULL)
    {
        printf("Problemas na Leitura do Arquivo\n");
        getch();
        exit(1);
    }
    else
    {
        printf("Leitura feita com sucesso!");    
    }

    fclose(arq); //fecha o arquivo
    getch();	
    return 0;
}

Leitura e Gravação de strings em arquivos

Uma forma simples de realizarmos leitura e gravação de strings em arquivos é através das funções fgets (leitura) e fputs (gravação).

Sua sintaxe é:
fputs(STRING,ARQUIVO);

onde ARQUIVO é um ponteiro de arquivo.
Caso ocorra algum erro esta função retorna EOF.

fgets(STRING,TAMANHO,ARQUIVO);

Ela lê STRING até que um caractere de nova linha seja lido ou que TAMANHO de caracteres tenham sido lidos.
Em caso de erro de leitura, ela retorna um ponteiro nulo.

Exemplo de Leitura de Arquivos

#include stdio.h
int main(int argc, char *argv[])
{
    FILE *arq;  
    char linha[100];  
    
    // Abre um arquivo TEXTO para LEITURA  
    arq = fopen("arquivo.txt", "r");
    if (arq == NULL)  //Se houve erro na abertura  
    {     
          printf("Problemas na abertura do arquivo\n"); 
          getch();    
          exit(1);  
    }
  
    while (!feof(arq))  //Faça enquanto não for o fim do arquivo
    {	// Lê uma linha (inclusive com o '\n')      
        fgets(linha, 99, arq); //lê até o caractere 99 ou o '\n'      
        printf("%s", linha);              
    }  
    fclose(arq);
    getch();	
    return 0;
}

Exemplo de Gravação de Arquivos

#include stdio.h

int main(int argc, char *argv[])
{
    FILE *arq;  
    char texto[100];  
    
    // Abre um arquivo TEXTO para GRAVAÇÃO  
    arq = fopen("arquivo2.txt", "w");
    if (arq == NULL)  // Se houve erro na abertura  
    {     
          printf("Problemas na abertura do arquivo\n"); 
          getch();    
          exit(1);  
    }
  
    do
    {
        gets(texto); // Le o texto digitado pelo usuário
        strcat(texto,"\n"); //Concatena uma quebra de linha
        fputs(texto,arq); //Grava o conteúdo da variável no arquivo
    }
    while(texto[0]!='\n');//Enquanto o primeiro caractere não for '\n'

    fclose(arq); 
    printf("%s", "Arquivo gravado com sucesso!");
    getch();	
    return 0;
}

Função rewind

Reposiciona o leitor do arquivo no seu início.

Ele é usado por exemplo quando queremos gravar um arquivo e em seguida ler seu conteúdo.

Após gravar um arquivo, o leitor aponta para o fim deste arquivo. O comando rewind() reposicionaria o leitor para o início, possibilitando a leitura do arquivo.

Sua sintaxe é:

rewind(ARQUIVO);

sendo ARQUIVO um ponteiro de arquivo.

Exemplo Leitura e Gravação

#include stdio.h
int main(int argc, char *argv[])
{
    FILE *arq;  
    char linha[100];  
    // Abre um arquivo TEXTO para LEITURA/GRAVAÇÃO  
    arq = fopen("arquivo.txt", "w+");
    if (arq == NULL)  // Se houve erro na abertura  
    {     
          printf("Problemas na abertura do arquivo\n"); 
          getch();    
          exit(1);  
    }
    do
    {
        gets(linha); // Le o texto digitado pelo usuário
        strcat(linha,"\n"); //Concatena uma quebra de linha
        fputs(linha,arq); //Grava o conteúdo da variável no arquivo
    }
    while(linha[0]!='\n');//Enquanto o primeiro caractere não for '\n'
    rewind(arq); //reposiciona o arquivo no início
    printf("%s", "Leitura do arquivo:\n\n");
    while (!feof(arq))  //Faça enquanto não for o fim do arquivo
    {	// Lê uma linha (inclusive com o '\n')      
        fgets(linha, 99, arq);//o 'fgets' lê até o caractere 99 ou o '\n'      
        printf("%s", linha);              
    } 
    fclose(arq); 
    getch();	
    return 0;
}

Função fread e fwrite

Para escrever e ler dados simples como inteiros, ponto flutuante ou estruturas de dados (registros) podemos usar as funções fread( ) e fwrite( ).

A sintaxe de fread( ) é:

fread(VARIÁVEL, TAMANHO, QUANTIDADE, ARQUIVO);

onde:
VARIÁVEL é o endereço da variável que receberá os dados lidos do arquivo ;
TAMANHO é o número de bytes a ser lido. Para calcular isso você deve usar o operador sizeof(tipo do dado)
QUANTIDADE indica quantos itens serão lidos, sendo que cada item será do tamanho de TAMANHO (normalmente a quantidade é 1)
ARQUIVO é um ponteiro para o arquivo aberto anteriormente

A sintaxe para fwrite( ) é idêntica, com a exceção que VARIÁVEL é o endereço da variável que contém os dados a serem gravados no arquivo.

O ponteiro de arquivo “ARQUIVO” deve ser aberto em modo binário, para podermos ler e escrever qualquer tipo de informação.

A sintaxe de fwrite( ) é:

fwrite(VARIÁVEL,TAMANHO,QUANTIDADE,ARQUIVO);

Exemplo de gravação usando fwrite

#include stdio.h

int main(int argc, char *argv[])
{
    FILE *arq;  
    int i=123;
    float f=12.99;
    double d=178.9587;
      
    // Abre um arquivo TEXTO para GRAVAÇÃO BINÁRIA  
    arq = fopen("arquivo.txt", "wb");
    if (arq == NULL)  // Se houve erro na abertura  
    {     
          printf("Problemas na abertura do arquivo\n"); 
          getch();    
          exit(1);  
    }
    //Grava o conteúdo das variáveis no arquivo
    fwrite(&i, sizeof(int), 1, arq); 
    fwrite(&f, sizeof(float), 1, arq); 
    fwrite(&d, sizeof(double), 1, arq);
    
    fclose(arq);   
    getch();	
    return 0;
}

Exemplo de gravação usando fread

#include stdio.h
int main(int argc, char *argv[])
{
    FILE *arq;  
    int i;
    float f;
    double d;
      
    // Abre um arquivo TEXTO para LEITURA BINÁRIA
    arq = fopen("arquivo.txt", "rb");
    if (arq == NULL)  // Se houve erro na abertura  
    {     
          printf("Problemas na abertura do arquivo\n"); 
          getch();    
          exit(1);  
    }
    printf("%s", "Leitura do arquivo:\n\n");
    //Le o valor do arquivo e joga na variável
    fread(&i, sizeof(int), 1, arq); 
    fread(&f, sizeof(float), 1, arq); 
    fread(&d, sizeof(double), 1, arq);               
    printf ("%d - %f - %f", i, f, d);
    fclose(arq);      
    getch();	
    return 0;
}

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s