algoritmos e estruturas de dados ii iec013 linguagem c - … · a linguagem c acessa um arquivo ou...

30
Algoritmos e Estruturas de Dados II IEC013 Linguagem Linguagem C C - Arquivos - Arquivos - - Prof. César Melo [email protected] Slides preparados pelo Prof. Leandro Galvão [email protected]

Upload: vodien

Post on 11-Dec-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Algoritmos e Estruturas de Dados IIIEC013

Linguagem Linguagem CC

- Arquivos - Arquivos --

Prof. César [email protected]

Slides preparados pelo Prof. Leandro Galvã[email protected]

Conceitos iniciaisConceitos iniciais

❖ Um arquivo (file) é uma Um arquivo (file) é uma seqüência de bytes seqüência de bytes que que reside em uma área de armazenamento (Ex: reside em uma área de armazenamento (Ex: disco magnético, flash drive, CD-ROM).disco magnético, flash drive, CD-ROM).

010101010010101010010010101001010100

Conceitos iniciaisConceitos iniciais

❖ A Linguagem C acessa um arquivo ou qualquer A Linguagem C acessa um arquivo ou qualquer outro dispositivo de entrada e saída através de outro dispositivo de entrada e saída através de um um endereço da memória endereço da memória principal.principal.

ProcessadorProcessador

BarramentoBarramento

Conceitos iniciaisConceitos iniciais

❖ Portanto, arquivos Portanto, arquivos não são acessados não são acessados diretamente diretamente pelo processador quando ele pelo processador quando ele executa um programa.executa um programa.

❖ Para manipular arquivos, é preciso associá-los a Para manipular arquivos, é preciso associá-los a uma uma streamstream e, então, manipular a stream. e, então, manipular a stream.

❖ A A associaçãoassociação de um arquivo a uma stream é de um arquivo a uma stream é realizada através de uma realizada através de uma operação deoperação de abertura abertura..

❖ A A dissociaçãodissociação é realizada por meio de uma é realizada por meio de uma operação deoperação de fechamento fechamento..

Conceitos iniciaisConceitos iniciais

ProcessadorProcessador

BarramentoBarramento

01010101001010101001001010100101

AssociaçãoAssociação

ManipulaçãoManipulação

DissociaçãoDissociação

Características dos arquivosCaracterísticas dos arquivos

❖ Podem armazenar Podem armazenar grande quantidadegrande quantidade de de informação.informação.

❖ Dados são Dados são persistentespersistentes (gravados em (gravados em disco).disco).

❖ Acesso aos dados pode não ser Acesso aos dados pode não ser seqüencialseqüencial (acesso direto à registro de um banco de (acesso direto à registro de um banco de dados).dados).

❖ Acesso à informação pode ser Acesso à informação pode ser concorrenteconcorrente ((mais de um programa ao mesmo tempo).).

Nomes e extensõesNomes e extensões

❖ Arquivos são Arquivos são identificadosidentificados por um nome. por um nome.

❖ O nome de um arquivo pode ter uma O nome de um arquivo pode ter uma extensãoextensão que indica o tipo do conteúdo do que indica o tipo do conteúdo do arquivo.arquivo.

arquivo.ext

Tipos de arquivosTipos de arquivos

❖ Arquivo texto: Arquivo texto: Armazena caracteres que Armazena caracteres que podem ser mostrados diretamente na tela podem ser mostrados diretamente na tela ou modificados por editores de texto ou modificados por editores de texto simples.simples.

◗ Exemplos:Exemplos: código C, texto simples, páginas código C, texto simples, páginas HTML.HTML.

❖ Arquivo binário:Arquivo binário: Seqüência de bits sujeita Seqüência de bits sujeita às convenções dos programas que o às convenções dos programas que o gerou, não legíveis diretamente.gerou, não legíveis diretamente.

◗ Exemplos:Exemplos: arquivos executáveis ou arquivos executáveis ou compactados, documentos do Word.compactados, documentos do Word.

Caminhos absolutos ou relativosCaminhos absolutos ou relativos

❖ O nome de um arquivo pode conter o seu O nome de um arquivo pode conter o seu diretório, ou seja, o diretório, ou seja, o caminhocaminho para encontrar tal para encontrar tal arquivo. arquivo.

❖ Os caminhos podem ser especificados de duas Os caminhos podem ser especificados de duas formas:formas:

◗ Caminho absoluto:Caminho absoluto: descrição desde o diretório raiz. descrição desde o diretório raiz.

◗ Caminho relativo:Caminho relativo: descrição desde o diretório corrente. descrição desde o diretório corrente.

/bin/emacs/bin/emacs/home/usr1/arq.txt/home/usr1/arq.txt

arq.txtarq.txtmc102/lab.cmc102/lab.c

Ponteiro de arquivoPonteiro de arquivo

❖ Como já comentado, a associação de um arquivo Como já comentado, a associação de um arquivo a uma stream é realizada pela a uma stream é realizada pela operação de operação de aberturaabertura..

❖ A abertura de um arquivo retorna um A abertura de um arquivo retorna um ponteiro ponteiro especialespecial para o início do arquivo, conhecido como para o início do arquivo, conhecido como ponteiro de arquivoponteiro de arquivo..

❖ Basicamente, o ponteiro de arquivo Basicamente, o ponteiro de arquivo identifica um identifica um arquivo específico arquivo específico em disco e é utilizado pela em disco e é utilizado pela stream associada para stream associada para direcionar as operações direcionar as operações de entrada/saídade entrada/saída (E/S). (E/S).

Ponteiro de arquivoPonteiro de arquivo

❖ Um ponteiro de arquivo deve ser Um ponteiro de arquivo deve ser declarado como sendo do tipo declarado como sendo do tipo FILEFILE..

❖ O tipo O tipo FILEFILE está definido na biblioteca está definido na biblioteca stdio.hstdio.h

❖ As funções que manipulam um arquivo As funções que manipulam um arquivo (ex.: escrita, leitura) devem ser realizadas (ex.: escrita, leitura) devem ser realizadas sobre o ponteiro declarado.sobre o ponteiro declarado.

FILE *arq;

Funções para manipulação de arquivosFunções para manipulação de arquivos

É para um arquivo o que printf() é para o console

fprintf()

Lê uma string de um arquivofgets()

Escreve uma string em um arquivofputs()

Lê um caractere de um arquivofgetc()

Escreve um caractere em um arquivofputc()

Fecha um arquivofclose()

Abre um arquivofopen()

FinalidadeFunção

Funções para manipulação de arquivosFunções para manipulação de arquivos

Apaga um arquivoremove()Posiciona o arquivo em um byte específicofseek()

Devolve verdadeiro se ocorreu um erroferror()

Devolve verdadeiro se o fim de arquivo for atingidofeof()

Lê tipos de dados maiores que um byte em arquivofread()

Escreve tipos de dados maiores que um byte em arquivofwrite()

É para um arquivo o que scanf() é para o consolefscanf()

FinalidadeFunção

fopen(<nome do arquivo>, <modo>)

Abrindo um arquivoAbrindo um arquivo:: Função :: Função fopen()fopen()

❖ Abre um arquivo para leitura e/ou escrita.Abre um arquivo para leitura e/ou escrita.

❖ Retorna um ponteiro para o arquivo.Retorna um ponteiro para o arquivo.

❖ NuncaNunca se deve alterar o valor desse ponteiro. se deve alterar o valor desse ponteiro.

❖ É a única função que tem o É a única função que tem o nome do arquivonome do arquivo como argumento. Todas as demais funções como argumento. Todas as demais funções utilizam o utilizam o valor do ponteiro valor do ponteiro para indicar que para indicar que arquivo estão manipulando.arquivo estão manipulando.

❖ O parâmetro O parâmetro <modo><modo> determina como o arquivo determina como o arquivo será aberto.será aberto.

Abrindo um arquivoAbrindo um arquivo:: Modo:: Modo

Anexa a um arquivo binário existenteab

Anexa a um arquivo texto existentea

Abre um arquivo binário para leitura e escritarb+

Cria/sobrescreve um arquivo texto para leitura e escritaw+

Cria/sobrescreve um arquivo binário para leitura e escritawb+

Abre um arquivo texto para leitura e escritar+

Cria/sobrescreve um arquivo binário para escritawb

Abre um arquivo binário para leiturarb

Cria/sobrescreve um arquivo texto para escritaw

Abre um arquivo texto para leiturar

SignificadoModo

Abrindo um arquivoAbrindo um arquivo:: Função :: Função fopen()fopen()

❖ Caso ocorra um erro na abertura do Caso ocorra um erro na abertura do arquivo, esta função retornará um arquivo, esta função retornará um ponteiro vazio (ponteiro vazio (NULLNULL))..

❖ Deve-se sempre testar o sucesso de Deve-se sempre testar o sucesso de fopen()fopen() antes de tentar qualquer outra antes de tentar qualquer outra operação sobre o arquivo.operação sobre o arquivo.

❖ O número máximo de arquivos que podem O número máximo de arquivos que podem estar abertos simultaneamente é dado estar abertos simultaneamente é dado pela macro pela macro FOPEN_MAXFOPEN_MAX, da biblioteca , da biblioteca stdio.hstdio.h..

fclose(<pt_arquivo>);

Fechando um arquivoFechando um arquivo:: Função :: Função fclose()fclose()

❖ Serve para dissociar uma stream de um Serve para dissociar uma stream de um arquivo aberto pela função arquivo aberto pela função fopen()fopen()..

❖ Em caso de sucesso, Em caso de sucesso, fclose()fclose() retorna 0 retorna 0 (zero). Qualquer outro valor indica erro no (zero). Qualquer outro valor indica erro no fechamento do arquivo indicado.fechamento do arquivo indicado.

151150

putc(<caractere>, <pt_arquivo>);fputc(<caractere>, <pt_arquivo>);

Escrevendo um caractereEscrevendo um caractere:: Função :: Função fputc()fputc()

❖ O padrão C ANSI define duas funções O padrão C ANSI define duas funções equivalentes para escrever caracteres em equivalentes para escrever caracteres em um arquivo: um arquivo: putc()putc() e e fputc()fputc()..

❖ Ambas escrevem caracteres em um Ambas escrevem caracteres em um arquivo que foi previamente aberto por arquivo que foi previamente aberto por fopen()fopen()..

152

Lendo um caractereLendo um caractere:: Função :: Função fgetc()fgetc()

❖ Para ler um caractere em um arquivo Para ler um caractere em um arquivo aberto por aberto por fopen()fopen(), pode-se usar as , pode-se usar as funções funções getc()getc() ou ou fgetc()fgetc(). .

❖ A função devolve A função devolve EOFEOF quando o final do quando o final do arquivo é alcançado.arquivo é alcançado.

var = fgetc(<pt_arquivo>);

do {ch = fgetc(pt_arq);

} while (ch != EOF);

Lendo um caractereLendo um caractere:: Função :: Função getc()getc()

❖ No código abaixo, o arquivo é lido até que No código abaixo, o arquivo é lido até que a marca de final de arquivo (a marca de final de arquivo (EOF – EOF – End of End of FileFile) seja alcançada.) seja alcançada.

153

Lendo uma stringLendo uma string:: Função :: Função fgets()fgets()

❖ Lê uma string de caracteres Lê uma string de caracteres da stream da stream especificada até que um caractere de especificada até que um caractere de nova linha nova linha seja lido ou que seja lido ou que length-1length-1 caracteres sejam lidos.caracteres sejam lidos.

❖ Se lido, o caractere de nova linha (Se lido, o caractere de nova linha (\n\n) faz ) faz parte da string.parte da string.

❖ A string resultante é terminada por um A string resultante é terminada por um caractere nulo (caractere nulo (\0\0).).

154

fgets(string, lenght, pt_arquivo);

Escrevendo uma stringEscrevendo uma string:: Função :: Função fputs()fputs()

❖ GravaGrava string de caracteres na stream string de caracteres na stream especificada.especificada.

❖ Devolve Devolve EOFEOF se ocorrer erro. se ocorrer erro.

155b

fputs(string, pt_arquivo);

155

Lendo e escrevendo estruturas de dadosLendo e escrevendo estruturas de dados:: Funções :: Funções fread()fread() e e fwrite()fwrite()

❖ Permitem a leitura e escrita de blocos de Permitem a leitura e escrita de blocos de qualquer tipo de dado.qualquer tipo de dado.

❖ bufferbuffer é um ponteiro para que receberá/ é um ponteiro para que receberá/ fornecerá os dados lidos/escritos no arquivo.fornecerá os dados lidos/escritos no arquivo.

❖ no_bytesno_bytes é o número de bytes a ler/escrever. é o número de bytes a ler/escrever.

❖ no_itensno_itens determina quantos itens serao lidos/ determina quantos itens serao lidos/ escritos, cada um de comprimento escritos, cada um de comprimento no_bytesno_bytes..

fread(buffer, no_bytes, no_itens, pt_arq);fwrite(buffer, no_bytes, no_itens, pt_arq);

❖ A função A função fread()fread() devolve o devolve o númeronúmero de itens lido de itens lido e a função e a função fwrite()fwrite() devolve o devolve o númeronúmero de itens de itens escritos.escritos.

❖ Se tais valores forem menores que o campo Se tais valores forem menores que o campo no_itensno_itens, é porque o final do arquivo (, é porque o final do arquivo (EOFEOF) foi ) foi atingido, ou ocorreu um erro.atingido, ou ocorreu um erro.

❖ Uma das aplicações mais úteis dessas funções Uma das aplicações mais úteis dessas funções envolve envolve ler e escrever tipos de dados definidos ler e escrever tipos de dados definidos pelo usuáriopelo usuário, especialmente , especialmente estruturasestruturas..

Lendo e escrevendo estruturas de dadosLendo e escrevendo estruturas de dados:: Funções :: Funções fread()fread() e e fwrite()fwrite()

156 157

Lendo e escrevendo dados formatadosLendo e escrevendo dados formatados:: Funções :: Funções fscanf()fscanf() e e fprintf()fprintf()

❖ Essas funções funcionam exatamente Essas funções funcionam exatamente como como printf()printf() e e scanf()scanf(), exceto por , exceto por operarem com arquivos.operarem com arquivos.

❖ Note que Note que fprintf()fprintf() e e scanf()scanf() direcionam suas operações de entrada e direcionam suas operações de entrada e saída formatadas para o arquivo apontado saída formatadas para o arquivo apontado por por pt_arqpt_arq..

fprintf(pt_arq, string_controle, argumentos);fscanf(pt_arq, string_controle, argumentos);

Lendo e escrevendo dados formatadosLendo e escrevendo dados formatados:: Funções :: Funções fscanf()fscanf() e e fprintf()fprintf()

❖ Embora essas duas funções sejam a maneira Embora essas duas funções sejam a maneira mais fácil de escrever e ler dados em arquivos de mais fácil de escrever e ler dados em arquivos de disco, disco, nem sempre são a escolha mais nem sempre são a escolha mais apropriadaapropriada..

❖ Como os dados são escritos em ASCII e Como os dados são escritos em ASCII e formatados como apareceriam na tela (e não em formatados como apareceriam na tela (e não em binário), binário), um tempo extra é perdido a cada um tempo extra é perdido a cada chamadachamada..

❖ Portanto, se há preocupação com Portanto, se há preocupação com velocidade velocidade ou ou tamanho tamanho de arquivo, deve-se utilizar as funções de arquivo, deve-se utilizar as funções fread()fread() e e fwrite()fwrite()..

159158

Biblioteca Biblioteca stdio.hstdio.h

❖ O arquivo de cabeçalho O arquivo de cabeçalho stdio.hstdio.h também também define várias macros como: define várias macros como: NULLNULL, , EOFEOF, , FOPEN_MAXFOPEN_MAX, , SEEK_SETSEEK_SET, , SEEK_CURSEEK_CUR e e SEEK_ENDSEEK_END..◗ A macro A macro NULLNULL define um ponteiro nulo. define um ponteiro nulo.

◗ A macroA macro EOF EOF corresponde ao valor inteiro corresponde ao valor inteiro -1-1, e , e indica o final de um arquivo.indica o final de um arquivo.

◗ As outras macros são utilizadas pela função As outras macros são utilizadas pela função fseek()fseek()..

Acesso aleatórioAcesso aleatório:: Função :: Função fseek()fseek()

❖ Operações de leitura e escrita aleatórias Operações de leitura e escrita aleatórias podem ser realizadas com a ajuda da podem ser realizadas com a ajuda da função função fseek()fseek(), que , que modifica o indicador modifica o indicador de posição de arquivode posição de arquivo..

❖ no_bytesno_bytes é o número de bytes, a partir de é o número de bytes, a partir de origemorigem, que se deseja avançar., que se deseja avançar.

❖ origemorigem é uma das seguintes macros:é uma das seguintes macros:

fseek(pt_arq, no_bytes, origem);

Acesso aleatórioAcesso aleatório:: Função :: Função fseek()fseek()

❖ A função A função fseek()fseek() pode ser utilizada para efetuar pode ser utilizada para efetuar movimentações em múltiplos de qualquer tipo de movimentações em múltiplos de qualquer tipo de dado, simplesmente utilizando-se o comando dado, simplesmente utilizando-se o comando sizeof()sizeof()..

160

SEEK_ENDFinal do arquivo

SEEK_CURPosição atual

SEEK_SETInício do arquivo

MacroOrigem

QuestõesQuestões