A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Prof: Erivelto Tschoeke, Msc. – UDESC – Centro de Ensino do Planalto Norte.

Apresentações semelhantes


Apresentação em tema: "Prof: Erivelto Tschoeke, Msc. – UDESC – Centro de Ensino do Planalto Norte."— Transcrição da apresentação:

1 Prof: Erivelto Tschoeke, Msc. – UDESC – Centro de Ensino do Planalto Norte

2 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

3 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.

4 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.

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

6 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.

7 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.

8 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.

9 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.

10 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.

11 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.

12 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.

13 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.

14 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.

15 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.

16 FunçãoDescrição fopen()Abre um arquivo putc()putc(), fputc()fputc()Escreve um caracter em um arquivo getc()getc(), fgetc()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

17 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.

18 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()).

19 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).

20 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.

21 Modo Descrição rAbre um arquivo texto para leitura wCria um arquivo texto para escrita aAdiciona texto ao fim de um arquivo texto rbAbre um arquivo binário para leitura wbAbre um arquivo binário para escrita abAnexa a um arquivo binário r+Abre um arquivo texto para leitura/escrita w+Cria um arquivo texto para leitura/escrita a+Cria ou anexa a um arquivo texto para leitura/escrita r+bAbre um arquivo binário para leitura/escrita r+bCria um arquivo binário para leitura/escrita a+bAnexa a um arquivo binário para leitura/escrita

22 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); }

23 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.

24 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.

25 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.

26 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()?

27 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).

28 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).

29 É 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.

30 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);

31 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.

32 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.

33 Acesse C101ec.c: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.cC101.c

34 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.c10les.c,


Carregar ppt "Prof: Erivelto Tschoeke, Msc. – UDESC – Centro de Ensino do Planalto Norte."

Apresentações semelhantes


Anúncios Google