• Nenhum resultado encontrado

Arquivos INF Prof. Lucas Mello Schnorr 1 / 22

N/A
N/A
Protected

Academic year: 2021

Share "Arquivos INF Prof. Lucas Mello Schnorr 1 / 22"

Copied!
31
0
0

Texto

(1)

Arquivos

INF01202

Prof. Lucas Mello Schnorr

(2)

Sumário

Lidar com Arquivos I Introdução I Conceitos I Terminologia

Em C (lidar com o conteúdo de arquivos) I Abrir fopen

I Fechar fclose I Ler fread I Escrever fwrite I Descarregar fflush I Testar m de arquivo feof I Avaliar condição de erro ferror

(3)

Arquivos

6 INF 01202 - Prof. Marcelo Walter – Aula 24

ü Repositóriospermanentes de dados

(informações) que possibilitam a comunicação dos programas com o ambiente.

ü Usualmente armazenados em dispositivos de memória auxiliar

(discos).

ü A alteração de um arquivo durante a execução de um programa torna

permanente - além do tempo de execução do programa - o processamento realizado.

ü Em arquivos é possível armazenar-se bem mais informações do que na memória principal.

Aula de Hoje - Arquivos

Cortesia: Prof. Marcelo Walter 3 / 22

(4)

Arquivos em C

7 INF 01202 - Prof. Marcelo Walter – Aula 24

Arquivos em C

ü  Repositórios permanentes de streams – sequências de bytes - armazenados em dispositivos de memória auxiliar

de forma permanente, a partir do uso de periféricos que aceitam tanto a leitura como a gravação de dados (discos magnéticos, pen drives, etc).

ü  Toda a entrada ou saída de dados é processada através do processamento de streams, independentemente do periférico utilizado (device independent)

ü As operações de entrada e saída de dados de um

arquivo (incluídos os dispositivos padrão stdin - de entrada e stdout - de saída) são apoiadas pelo armazenamento temporário destes streams em áreas da memória principal denominadas buffers.

(5)

Stream

Streams

• O sistema de E/S do C utiliza o conceito de streams.

• Um stream é um dispositivo lógico (um canal de manipulação) que representa um arquivo ou um dispositivo qualquer (monitor, teclado,etc). • Operações sobre streams são “bufferizadas”,

ou seja, trabalham com uma área de memória intermediária (buffer) e não propriamente sobre o disco.

4

Cortesia: Prof. Edison Pignaton de Freitas 5 / 22

(6)

Como funciona?

8 INF 01202 - Prof. Marcelo Walter – Aula 24

Esquema de utilização de arquivos

Abre/Cria Fecha e salva em DISCO Descarrega buffer Disco MANIPULA Memória principal Movimentação de dados Funções Arquivo x Buffer do arquivo x

• arquivo: entidade externa ao programa;

•  armazenamento permanente (não se perdem ao término do programa) das informações em memória secundária (periféricos).

(7)

Tipos de arquivo

9 INF 01202 - Prof. Marcelo Walter – Aula 24

ü  Binário: composto por uma sequência (fluxo binário) 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.

Ø  Texto: composto de uma sequência de bytes

correspondendo a uma sequência de caracteres ASCII, incluindo letras, dígitos e caracteres especiais utilizados na escrita e os separadores branco, tab e new line (indicando final de linha e, dependendo do ambiente, utilizando para isso 1 ou 2 caracteres ASCII ), que pode ou não ser dividida em linhas terminadas por um caractere de final de linha.

Tipos de arquivos do C

Nas próximas aulas Aula de Hoje

Cortesia: Prof. Marcelo Walter 7 / 22

(8)

Arquivo Binário

10 INF 01202 - Prof. Marcelo Walter – Aula 24

•  agregado sequencial de bytes;

•  logicamente, o stream pode ser visto

como um conjunto de dados simples ou estruturados;

•  não tem limitação teórica de tamanho;

•  comprimento do arquivo: número de

elementos que apresenta no momento; •  elementos não tem nome;

•  somente um elemento é acessível a cada

momento

→ elemento corrente

•  Acesso aos dados: sequencial ou randômico.

Arquivo Binário

O que está armazenado aqui?

(9)

Exemplo de arquivo binário com inteiros

12 INF 01202 - Prof. Marcelo Walter – Aula 24

1 inteiro = 4 bytes

00000000000000000000000000000100 (...

) 00000000000000000000000000000001

Arquivos:

armazenamento

Seja um arquivo de inteiros :

Primeiro inteiro Último inteiro

As separações entre bytes são apenas ilustrativas, no disco não existem! 00000000000000000000000000100000

Segundo inteiro

fim de arquivo

Cortesia: Prof. Marcelo Walter 9 / 22

(10)

Operações em C para arquivos binários

Retiradas da biblioteca stdio.h

Operação Função Abrir fopen Fechar fclose Ler fread Escrever fwrite Descarregar fflush Testar m de arquivo feof Avaliar condição de erro ferror

(11)

Protótipos das funções

O que há de comum entre estas funções?

FILE *fopen(const char *pathname, const char *mode);

int fclose(FILE *stream);

size_t fread(void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

size_t fwrite(const void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

int fflush(FILE *stream);

int feof(FILE *stream);

(12)

O ponteiro para uma estrutura FILE (aka FILE*)

Slide 9 INF 01202

Declaração de um ponteiro “FILE”

FILE *point_arq

O tipo FILE identifica um stream, contendo informação necessária para seu controle (como indicadores de posição de função).

// Programa que utiliza arquivos

#include <stdio.h>// e demais biblioteca necessárias ...

int main( ) {

FILE *arq; //declaração de um “ponteiro de arquivo”

FILE *arq1, *arq2; ...

}

Observar que FILE é

sempre escrito em maiúsculas!!!

Para cada arquivo utilizado

simultaneamente deve ter sido ou ser definido um ponteiro.

(13)

Sempre vericar o retorno destas funções

Slide 10 INF 01202

Funções de manipulação de arquivo

fopen fclose fflushfreadfwritefeof ferror O sucesso ou fracasso da execução destas funções pode ser verificado a partir do valor retornado. É altamente recomendado que os programas incluam

esta verificação!

Cortesia: Prof. Claudio Jung 13 / 22

(14)

Abrir arquivo fopen

FILE *fopen(const char *pathname, const char *mode); pathname é o caminho para o arquivo (o nome do arquivo) mode é o modo de abertura

Modo Comportamento stream

r para leitura início

r+ para leitura e escrita, não apaga arquivo início w para escrita, apaga arquivo se existe início w+ para leitura e escrita, o arquivo é truncado início a para concatenação no nal do arquivo m a+ para leitura e concatenação no nal do arquivo m

Pode-se misturar modos.

Outros modos relevantes: b para arquivos binários. Valor de retorno:

I se tudo bem, ponteiro para o descrito de arquivo subjacente I caso contrário, NULL

(15)

Abrir arquivo fopen

FILE *fopen(const char *pathname, const char *mode); pathname é o caminho para o arquivo (o nome do arquivo) mode é o modo de abertura

Modo Comportamento stream

r para leitura início

r+ para leitura e escrita, não apaga arquivo início w para escrita, apaga arquivo se existe início w+ para leitura e escrita, o arquivo é truncado início a para concatenação no nal do arquivo m a+ para leitura e concatenação no nal do arquivo m Pode-se misturar modos.

Outros modos relevantes: b para arquivos binários.

Valor de retorno:

I se tudo bem, ponteiro para o descrito de arquivo subjacente I caso contrário, NULL

(16)

Abrir arquivo fopen

FILE *fopen(const char *pathname, const char *mode); pathname é o caminho para o arquivo (o nome do arquivo) mode é o modo de abertura

Modo Comportamento stream

r para leitura início

r+ para leitura e escrita, não apaga arquivo início w para escrita, apaga arquivo se existe início w+ para leitura e escrita, o arquivo é truncado início a para concatenação no nal do arquivo m a+ para leitura e concatenação no nal do arquivo m Pode-se misturar modos.

Outros modos relevantes: b para arquivos binários. Valor de retorno:

I se tudo bem, ponteiro para o descrito de arquivo subjacente I caso contrário, NULL

(17)

Fechar arquivo fclose

Protótipo

int fclose(FILE *stream);

A função fclose descarrega o stream apontado por stream (escrevendo qualquer dado buferizado usando fflush) e fecha o descritor de arquivo subjacente.

Valor de retorno

I se tudo bem, 0 é retornado

I caso contrário, o valor de EOF é retornado.

(18)

Exemplo com fopen/fclose

#include <stdio.h>

int main() {

FILE *arquivo;

arquivo = fopen("notas_da_turma.bin", "r");

if (arquivo == NULL){

printf("O arquivo não pode ser aberto.\n"); }

return 0; }

Assumindo que o arquivo existe, o que aconteceria se: I O modo fosse "rb"

I O modo fosse "ra" I O modo fosse "a" I O modo fosse "w"

(19)

Exemplo com fopen/fclose

#include <stdio.h>

int main() {

FILE *arquivo;

arquivo = fopen("notas_da_turma.bin", "r");

if (arquivo == NULL){

printf("O arquivo não pode ser aberto.\n"); }

return 0; }

Assumindo que o arquivo existe, o que aconteceria se: I O modo fosse "rb"

I O modo fosse "ra" I O modo fosse "a" I O modo fosse "w"

(20)

A função de descarregamento fflush

Para streams de saída

I Força a escrita em disco de todos os dados em buer

Para streams de entrada

I Desconsidera todos os dados em buer que ainda não consumidos

Para o caso do exemplo abaixo

fflush(NULL);

(21)

A função de descarregamento fflush

Para streams de saída

I Força a escrita em disco de todos os dados em buer Para streams de entrada

I Desconsidera todos os dados em buer que ainda não consumidos

Para o caso do exemplo abaixo

fflush(NULL);

a função descarrega todos os streams de saída abertos.

(22)

A função de descarregamento fflush

Para streams de saída

I Força a escrita em disco de todos os dados em buer Para streams de entrada

I Desconsidera todos os dados em buer que ainda não consumidos

Para o caso do exemplo abaixo

fflush(NULL);

(23)

Escrever fwrite

Protótipo

size_t fwrite(const void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

Escreve nmemb itens de dados, cada um de tamanho size bytes, para o stream apontado por stream, obtendo os dados da localização dada pelo endereço em ptr.

Exemplos

int meu_inteiro;

fwrite(&meu_inteiro, sizeof(int), 1, arquivo);

double muitos_dados[TAMANHO];

fwrite(&muitos_dados, sizeof(double), TAMANHO, arquivo);

(24)

Escrever fwrite

Protótipo

size_t fwrite(const void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

Escreve nmemb itens de dados, cada um de tamanho size bytes, para o stream apontado por stream, obtendo os dados da localização dada pelo endereço em ptr.

Exemplos

int meu_inteiro;

fwrite(&meu_inteiro, sizeof(int), 1, arquivo);

double muitos_dados[TAMANHO];

(25)

Ler fread

Protótipo

size_t fread(void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

Lê nmemb itens de dados, cada um de tamanho size bytes, do stream apontado por stream, registrando os dados lidos na localização dada pelo endereço em ptr.

Exemplos

int meu_inteiro;

fread(&meu_inteiro, sizeof(int), 1, arquivo);

double muitos_dados[TAMANHO];

fread(&muitos_dados, sizeof(double), TAMANHO, arquivo);

(26)

Ler fread

Protótipo

size_t fread(void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

Lê nmemb itens de dados, cada um de tamanho size bytes, do stream apontado por stream, registrando os dados lidos na localização dada pelo endereço em ptr.

Exemplos

int meu_inteiro;

fread(&meu_inteiro, sizeof(int), 1, arquivo);

double muitos_dados[TAMANHO];

(27)

Valor de retorno de fwrite e fread

Protótipos

size_t fwrite(const void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

size_t fread(void *ptr,

size_t size,

size_t nmemb,

FILE *stream);

As duas funções retornam a quantidade de bytes efetivamente escritos ou lidos.

(28)

Testar EOF com feof e condição de erro com fwrite

int feof(FILE *stream);

int ferror(FILE *stream);

A função feof testa o indicador de m de arquivo para o stream apontado por stream, retornando não zero se estiver setado.

A função ferror testa o indicador de erro para o stream apontado por stream, retornando não zero se estiver setado.

Estas funções podem (ou até devem) ser empregadas após cada operação de entrada/saída.

Exemplo: ler enquanto não chegar no m do arquivo

while(!feof(arquivo)) { ... }

Exemplo: vericar se houveram erros na leitura

int meu_inteiro;

fread(&meu_inteiro, sizeof(int), 1, arquivo);

if (ferror(arquivo)) {

// aconteceu um erro na leitura

(29)

Testar EOF com feof e condição de erro com fwrite

int feof(FILE *stream);

int ferror(FILE *stream);

A função feof testa o indicador de m de arquivo para o stream apontado por stream, retornando não zero se estiver setado.

A função ferror testa o indicador de erro para o stream apontado por stream, retornando não zero se estiver setado.

Estas funções podem (ou até devem) ser empregadas após cada operação de entrada/saída.

Exemplo: ler enquanto não chegar no m do arquivo

while(!feof(arquivo)) { ... }

Exemplo: vericar se houveram erros na leitura

int meu_inteiro;

fread(&meu_inteiro, sizeof(int), 1, arquivo);

if (ferror(arquivo)) {

// aconteceu um erro na leitura

}

(30)

Testar EOF com feof e condição de erro com fwrite

int feof(FILE *stream);

int ferror(FILE *stream);

A função feof testa o indicador de m de arquivo para o stream apontado por stream, retornando não zero se estiver setado.

A função ferror testa o indicador de erro para o stream apontado por stream, retornando não zero se estiver setado.

Estas funções podem (ou até devem) ser empregadas após cada operação de entrada/saída.

Exemplo: ler enquanto não chegar no m do arquivo

while(!feof(arquivo)) { ... }

Exemplo: vericar se houveram erros na leitura

int meu_inteiro;

fread(&meu_inteiro, sizeof(int), 1, arquivo);

if (ferror(arquivo)) {

// aconteceu um erro na leitura

(31)

Exercício #1

Slide 26 INF 01202

26

Exercícios

1. Faça um programa para gravar um arquivo composto por estruturas que contenham nome, idade e altura de atletas.

2. Faça outro programa, agora para listar um arquivo com estas estruturas.

3. Faça uma função (que recebe um nome de arquivo como entrada), e imprima a altura de atletas cujos nomes foram lidos do teclado. A função deve abrir e fechar o arquivo, e possibilitar a busca de diversos atletas.

4. Faça outro programa que insere um novo registro no final do arquivo.

Cortesia: Prof. Claudio Jung 22 / 22

Referências

Documentos relacionados

Descobri também que as urtigas de folha larga (fig.11) eram aproveitadas para fazer sopa e as meruges, utilizadas cruas em saladas, ambas para curar fraquezas e

A Fundação Santa Casa de Misericórdia de Franca é Hospital Geral , de referência em Alta Complexidade, de natureza filantrópica, mantenedora de um Complexo Hospitalar que

O método stepwise diz respeito à forma como as possíveis variáveis explicativas são testadas na modelagem pesquisada pela análise de regressão linear, isto é, ele

Foram diagnosticadas nove doenças bióticas: vira cabeça do tomateiro (Tomato spotted wilt virus), oídio (Oidium sp.), murcha de fusário (Fusarium oxysporum), requeima

Um dos desaos é potencializar o alcance da ABRASFE por meio da busca e entendimento do que de fato faz sentido aos clientes nais, sempre nos desaando a entregar mais e com maior

Apenas a paixão de Frey re pela descrição e pelo detalhe, colocada a serv iço de uma empresa tão árdua quanto apresentar um painel da formação da família e da sociedade

O ensino nesta unidade curricular assenta em aulas teóricas, com uma utilização intensa e programada de elementos audiovisuais, e aulas práticas de discussão e análise de

Na Figura 1 são apresentados os dados médios mensais de temperatura máxima diária, temperatura mínima diária, temperatura média diária e umidade relativa do ar, para o período