Prof: Erivelto Tschoeke, Msc. – [email protected] UDESC – Centro de Ensino do Planalto...

34
Prof: Erivelto Tschoeke, Msc. – [email protected] UDESC – Centro de Ensino do Planalto Norte

Transcript of Prof: Erivelto Tschoeke, Msc. – [email protected] UDESC – Centro de Ensino do Planalto...

Page 1: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Prof: Erivelto Tschoeke, Msc. – [email protected] – Centro de Ensino do Planalto Norte

Page 2: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Introdução Fluxos de Dados e Arquivos

Fluxo de Texto Fluxo Binário Arquivos

Funções de Entrada e Saída Início e Fim

Abrindo um Arquivo Fechando um Arquivo Fim de Arquivo Volta ao Início

Lendo e Escrevendo Caracteres Lendo e Escrevendo Cadeias de Caracteres Lendo e Escrevendo Arquivos Binários Entrada e Saída Formatada Exercícios

Page 3: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Em C não existem comandos de Entrada e Saída, sendo estas tarefas executadas por funções especialmente criadas para esta finalidade e armazenadas em bibliotecas específicas.

Page 4: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Para isolar os programadores dos problemas de manipular os vários tipos de dispositivos de armazenamento e seus diferentes formatos a linguagem C utiliza o conceito de fluxo (stream) de dados.

Todos os diferentes sistemas de arquivos se comportam da mesma maneira quando manipulados como um fluxo contínuo de dados.

Page 5: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Dados podem ser manipulados em dois diferentes tipos de fluxos: Fluxos de texto; Fluxos binários.

Page 6: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Um fluxo de texto é composto por uma seqüência de caracteres, que pode ou não ser dividida em linhas terminadas por um caracter de final de linha.

Um detalhe que deve ser considerado é que na última linha não é obrigatório o caracter de fim de linha.

Page 7: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Nem sempre a tradução entre a representação do caracter no fluxo de texto e no sistema de arquivos do computador hospedeiro é um para um.

Por exemplo, entre UNIX e DOS há uma diferença na representação de final de linha que causa problemas na impressão de arquivos. Em UNIX um final de linha é representado pelo caracter de alimentação de linha.

Page 8: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Em DOS um final de linha é representado pelo par retorno de carro/alimentação de linha.

Deste modo quando um arquivo gerado em UNIX vai para uma impressora que espera final de linha no modo DOS surge o que é comumente chamado de efeito escada.

A impressão continua na linha seguinte mas sem voltar para o início da linha porque em UNIX o caracter de retorno de carro não é inserido no fluxo de texto.

Page 9: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Um fluxo binário é composto por uma seqüência de bytes lidos, sem tradução, diretamente do dispositivo externo.

Não ocorre nenhuma tradução e existe uma correspondência um para um entre os dados do dispositivo e os que estão no fluxo.

Page 10: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Arquivos podem ser acessados/enviados de qualquer dispositivo de Entrada e Saída como por exemplo: Impressoras; Disquetes; Discos rígidos; Unidades de fita; Pen-drives; Cartões de memória, etc.

Page 11: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Programas vêem os arquivos através de fluxos.

Para que um determinado arquivo seja associado a um determinado fluxo é necessário que o arquivo seja aberto.

Após esta operação o programa pode utilizar os dados armazenados no arquivo.

Page 12: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Operações comuns em arquivos são: Abertura e fechamento de arquivos; Apaga um arquivo; Leitura e escrita de um caracter; Indicação de que o fim do arquivo foi

atingido; Posicionar o arquivo em um ponto

determinado.

Page 13: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Obviamente algumas dessas funções não se aplicam a todos os tipos de dispositivos.

Por exemplo, para uma impressora não é possível usar a função que reposiciona o arquivo no início.

Um arquivo em disco permite acesso aleatório enquanto um arquivo de impressora não.

Page 14: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

 Ao final das operações necessárias o programa deve fechar o arquivo.

Ao final da execução de um programa todos os arquivos associados são fechados automatica- mente e os conteúdos dos buffers são descarregados para o dispositivo externo.

Caso o arquivo seja de entrada o conteúdo do buffer é esvaziado.

Page 15: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

As funções de Entrada e Saída normalmente utilizadas pelos programadores estão armazenadas na biblioteca stdio.h.

As funções mais comuns estão mostradas na tabela a seguir.

Page 16: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Função Descriçãofopen() Abre um arquivo

putc(), fputc() Escreve um caracter em um arquivo

getc(), fgetc() Lê um caracter de um arquivo

fprintf() Equivalente a printf(), usando stream

sscanf() Equivalente a scanf(), usando string 

fscanf() Equivalente a scanf(), usando stream 

fseek() Posiciona o arquivo em um ponto específico

rewind() Posiciona o arquivo no início

feof() Retorna VERDADE se chegou ao fim do arquivo

ferror() Verifica a ocorrência de erro

fflush() Descarrega o buffer associado com o arquivo

fread() Leitura de dados no modo binário

fwrite() Escrita de dados no modo binário

Page 17: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Para ter acesso aos dados em um arquivo é necessário a definição de um ponteiro do tipo especial FILE.

Este tipo também está definido na biblioteca stdio.h.

Um ponteiro deste tipo permite que o programa tenha acesso a uma estrutura que armazena informações importantes sobre o arquivo.

Para definir uma variável deste tipo o programa deve conter a seguinte declaração

FILE *arq; Onde arq é o ponteiro que será usado para

executar as operações no arquivo.

Page 18: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

As operações mostradas a seguir mostram operações que devem ser realizadas antes e depois de usar um arquivo (fopen() e fclose()).

As outras duas funções servem para que o usuário possa detectar o fim de um arquivo ou voltar para seu início (feof() e rewind()).

Page 19: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Antes de qualquer operação ser executada com o arquivo, ele deve ser aberto.

Esta operação associa um fluxo de dados a um arquivo.

Um arquivo pode ser aberto de diversas maneiras: leitura, escrita, leitura/escrita, adicão de texto, etc.

A função utilizada para abrir o arquivo é chamada fopen() e tem o seguinte protótipo:

FILE fopen (char *parq).

Page 20: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Onde parq é um ponteiro de arquivo para o arquivo a ser manipulado.

Este ponteiro não deve ser modificado e a função retorna um ponteiro nulo (NULL) se o arquivo não puder ser aberto.

A tabela a seguir lista os diversos modos que podem ser usados para abrir um arquivo.

Page 21: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Modo Descriçãor Abre um arquivo texto para leituraw Cria um arquivo texto para escritaa Adiciona texto ao fim de um arquivo textorb Abre um arquivo binário para leiturawb Abre um arquivo binário para escritaab Anexa a um arquivo binárior+ Abre um arquivo texto para leitura/escritaw+ Cria um arquivo texto para leitura/escrita

a+Cria ou anexa a um arquivo texto para leitura/escrita

r+b Abre um arquivo binário para leitura/escritar+b Cria um arquivo binário para leitura/escritaa+b Anexa a um arquivo binário para leitura/escrita

Page 22: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Observar que se um arquivo for aberto com permissão de escrita todo o sue conteúdo anterior será apagado. Caso o arquivo não exista ele será criado.

A maneira mais comum de abrir um arquivo está ilustrado no exemplo abaixo:    

FILE *pa;     if (( pa = fopen ("arquivo.txt", "w")) == NULL ) {        printf("Desculpe, o arquivo nao pode ser

aberto.");        exit(1);    }

Page 23: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Abrir um arquivo que já existe para escrita, implica em apagar todo o conteúdo anterior do arquivo e a preparação do arquivo para receber dados a partir de seu ponto inicial.

Se o programador deseja acrescentar dados ao final de um arquivo já existente o modo de abertura deve ser a.

Page 24: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Um arquivo aberto por meio da função fopen() deve ser fechado com a função fclose() cujo protótipo é

int fclose (FILE *parq);

onde parq é um ponteiro de arquivo para o arquivo que deve ser fechado.

Um valor zero de retorno significa que a operação foi executada com êxito, qualquer outro valor implica em erro.

Page 25: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

 A operação fclose() implica em escrita no arquivo de qualquer dado que ainda não tenha sido escrito.

Este ponto é importante de ser considerado porque em UNIX uma operação de escrita em um arquivo não ocorre imediatamente a emissão da ordem de escrita.

O sistema operacional pode executar a ordem no momento que achar mais conveniente.

Page 26: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

A função feof() indica que um arquivo chegou ao seu final.

A pergunta que pode surgir é a seguinte:

Se já existe o valor EOF para indicar o final de arquivo por que precisamos de uma função extra do tipo feof()?

Page 27: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

 O problema é que EOF é um valor inteiro e ao ler arquivos binários este valor pode ser lido como parte do arquivo e não por ser o final do arquivo.

A função feof() serve para indicar que o final de um arquivo binário foi encontrado.

Naturalmente esta função pode ser aplicada também a arquivos texto.

O protótipo da função é o seguinte: int feof(FILE *parq).

Page 28: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

A função rewind() recoloca o indicador de posição de arquivo no inicio do arquivo.

Uma operação semelhante ao que fazemos em uma fita cassete de música ou vídeo. O protótipo da função é o seguinte:  

void rewind(FILE *parq).

Page 29: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

É importante observar que o arquivo deve estar aberto em um modo que permita a execução das operações desejadas.

Por exemplo, um arquivo aberto somente para escrita e em seguida rebobinado para o início, não irá permitir outra operação que não seja escrita.

Page 30: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

As operações mais simples em arquivos são a leitura e escrita de caracteres. Para ler um caracter de um arquivo que foi previamente aberto pode se usar as funções getc() e fgetc(), que são equivalentes. O protótipo de fgetc é:

int fgetc (FILE *parq);

Page 31: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

A função lê o caracter como um unsigned char mas retorna o valor como um inteiro, onde o byte mais significativo vale zero.

A função devolve o código EOF ao chegar ao final do arquivo.

O valor EOF também é um inteiro válido e portanto ao usar arquivos binários é necessário que a função feof() seja utilizada para verificar o final do arquivo.

Page 32: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

 Para escrever caracteres há duas funções definidas putc() e fputc(). O protótipo da função fputc é o seguinte:    

int fputc(int ch, FILE *parq).

onde parq é um ponteiro de arquivo para o arquivo que foi previamente aberto por meio da função fopen() e ch é o caracter a ser escrito.

Page 33: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

Acesse C101ec.c:

Neste primeiro programa usamos a função REWIND() para retornar ao início do programa, outra opção seria fechar e abrir o arquivo, pois sempre que um arquivo é aberto, ele fica posicionado no início do arquivo aguardando o comando seguinte.

Acesse C101.c

Page 34: Prof: Erivelto Tschoeke, Msc. – erivelto@sbs.udesc.br UDESC – Centro de Ensino do Planalto Norte.

As funções fgets() e fputs() servem para ler e escrever cadeias de caracteres em arquivos.

 A função fgets() lê uma cadeia de caracteres do fluxo especificado até que um caracter de nova linha seja encontrada.

Observar que diferentemente de gets() o caracter de nova linha encontrado passa a fazer parte da cadeia que recebe um caracter nulo ao seu final.

O exemplo c10les.c, mostra um exemplo de uso das funções para ler e escrever cadeias de caracteres em um arquivo.