Algoritimo e Extrutura de dados

Post on 03-Dec-2015

17 views 4 download

description

aula sobre algoritmo e extrura de dados cap I

Transcript of Algoritimo e Extrutura de dados

Arquivos

SISTEMAS DE INFORMAÇÃO - 1o PERÍODO

UNIMONTES / 2015

ALGORITMOS E ESTRUTURAS DE DADOS I

Prof. Maurílio J. Inácio

Leia Nota

Nota<6 Reprovado

Nota<7 Recuperação

Aprovado

1 2 3 4 5

#include <stdio.h> #include <stdlib.h> int main() { printf("Hello Word!"); system("pause"); return 0; }

sim

sim

não

não

Arquivos Introdução

Armazenar dados em estruturas de dados, tais como vetores, matrizes ou registros, é muito útil para manipular informações do mundo real.

Entretanto, tais estruturas são sempre manipuladas na memória principal (RAM), que é volátil.

Isto significa que, após o encerramento do programa, os dados são perdidos.

Para manter os dados armazenados de forma persistente é necessário utilizar um meio de armazenamento não volátil, tais como os discos magnéticos, discos óticos ou outro tipo de memória não volátil (exemplo: memórias FLASH RAM).

2

Arquivos

3

- Vista interna de um disco rígido.

Atuador

Discos

Cabeças de leitura/gravação

Arquivos

4

- Vista interna de um disco de estado sólido (Solid State Disk – SSD).

CI’s de memória flash

Arquivos Introdução

Dados são armazenados em disco na forma de arquivos.

Arquivos tem um nome no sistema operacional e são agrupados em diretórios ou pastas. A estrutura de diretórios é hierárquica e forma uma “árvore”.

Arquivos podem ser acessados por meio do caminho, a partir do diretório “raiz”, até o diretório onde o arquivo se encontra.

Cada diretório é separado por uma barra (/ nos sistemas operacionais Unix e Linux, \ nos sistemas operacionais padrão Microsoft). Exemplo:

C:\Disciplinas 2011\AEDI\Alunos\Notas

5

Arquivos

6

Diretório raiz \

Disciplinas 2010 Disciplinas 2011

AEDI AEDII AEDI AEDII

- Exemplo de árvore de diretórios. Arquivos

Arquivos Introdução

Pode-se manipular os dados armazenados em arquivos por meio do próprio sistema operacional, que possui rotinas para criar, abrir, ler, gravar e fechar arquivos.

As linguagens de programação são capazes de fazer chamadas ao sistema operacional e, assim, utilizar arquivos.

Portanto, os arquivos manipulados dentro de um programa podem ser acessados por via sistema operacional.

A manipulação de arquivos nos programas é feita por meio de algumas funções básicas.

7

Arquivos Introdução

Quando um programa é executado, este tem acesso ao diretório corrente (diretório onde programa esta armazenado).

Neste caso, o programa não precisa indicar o caminho para acessar arquivos do mesmo diretório.

Caso os arquivos estejam em outro diretório, o programa poderá utilizar dois tipos de caminhos:

Absoluto: caminho completo para o arquivo, exemplo:

\Disciplinas 2011\AEDI\Alunos\Notas

Relativo: caminho para o arquivo a partir do diretório corrente, exemplo:

..\AEDI\Alunos\Notas

8

Arquivos Sistema de E/S em C

A linguagem C não possui nenhum comando de E/S. Ao contrário, todas operações de E/S ocorrem mediante chamadas a funções da biblioteca padrão.

C possui um sistema de E/S que fornece uma interface consistente ao programador, independentemente do dispositivo real acessado.

Isto significa que o sistema de E/S de C provê um nível de abstração entre o programador e o dispositivo utilizado.

Esta abstração é chamada de stream e o dispositivo real é chamado de arquivo.

9

Arquivos Streams

O sistema de arquivos de C foi projetado para trabalhar com uma ampla variedade de dispositivos (terminal, disco, fita, etc.).

Embora os dispositivos sejam diferentes, o sistema de arquivos de C transforma-os em um dispositivo lógico chamado stream.

Todas as streams se comportam de forma semelhante.

Pelo fato de serem independentes do dispositivo, a mesma função pode escrever em um arquivo em disco ou em outro dispositivo, como o console.

Existem dois tipos de streams: texto e binária.

10

Arquivos Streams

Stream de texto é uma sequência de caracteres.

O padrão C ANSI permite (mas não exige) que uma stream de texto seja organizada em linhas terminadas por um caractere de nova linha.

O caractere de nova linha é opcional na última linha e é determinado pela implementação (a maioria dos compiladores C não termina streams de texto com caracteres de nova linha)

Em uma stream de texto, certas traduções podem ocorrer conforme exigido pelo sistema host, podendo não haver uma relação de um para um entre os caracteres lidos/escritos e aqueles no dispositivo real.

11

Arquivos Streams

Stream binária é uma sequência de bytes com uma correspondência um para um com aqueles encontrados no dispositivo real (não ocorre tradução de caracteres como na stream de texto).

Em streams binárias, o número de bytes lidos ou escritos é o mesmo que o encontrado no dispositivo real.

Dependendo da implementação, um número de bytes nulos pode ser acrescentado a uma stream binária.

Esses bytes nulos podem ser usados para aumentar a informação de forma que ela preenchesse um setor do disco, por exemplo.

12

Arquivos Arquivos em C

Em C, um arquivo pode ser qualquer coisa, desde um arquivo em disco até um terminal ou impressora.

A associação entre uma stream como o arquivo especifico é realizada numa operação de abertura.

Uma vez que o arquivo esteja aberto, as informações podem ser trocadas entre ele e o programa.

Nem todos arquivos apresentam os mesmos recursos, por exemplo: disco e teclado (em C, todas as streams são iguais, mas não todos os arquivos).

Um arquivo que suporta acesso aleatório possui um indicador de posição no arquivo.

13

Arquivos Arquivos em C

Um arquivo é desassociado de uma stream específica por meio de uma operação de fechamento.

No fechamento do arquivo, se houver algum conteúdo, os dados serão escritos no dispositivo externo (processo denominado flushing).

Todos os arquivos são fechados quando o programa termina normalmente. Se houver uma terminação inesperada do programa (crash) ou uma chamada a função abort(), os arquivos não serão fechados.

Cada stream associada a um arquivo tem uma estrutura de controle de arquivo tipo FILE (definida em STDIO.H).

14

Arquivos Funções do sistema de arquivos

O sistema de arquivos C ANSI é composto de diversas funções apresentadas a seguir.

Essas funções exigem que o cabeçalho STDIO.H seja incluído em qualquer programa em que serão utilizadas.

A maioria das funções começa com a letra “f”, uma convenção herdada do padrão C UNIX.

STDIO.H fornece os protótipos para as funções e define três tipos: size_t, fpos_t e FILE.

STDIO.H também define várias macros, sendo as mais relevantes: NULL, EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR, SEEK_END.

15

Arquivos Funções do sistema de arquivos

16

Nome Função

fopen() Abre um arquivo.

fclose() Fecha um arquivo.

fputc() Escreve um caractere em um arquivo.

fgetc() Lê um caractere de um arquivo.

fputs () Escreve uma string em um arquivo.

fgets() Lê uma string de um arquivo.

fseek() Posiciona o arquivo em um byte específico.

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

fscanf() É para um arquivo o que scanf() é para o console.

Arquivos Funções do sistema de arquivos

17

Nome Função

fwrite() Escreve um bloco de dados em um arquivo.

fread() Lê um bloco de dados de um arquivo.

feof() Devolve verdadeiro se o fim de arquivo for atingido.

ferror() Devolve verdadeiro se ocorreu um erro.

rewind() Recoloca o indicador de posição de arquivo no início do arquivo

remove() Apaga um arquivo.

fflush() Descarrega um arquivo.

Arquivos Ponteiro de arquivo

Ponteiro é o meio comum que une o sistema C ANSI de E/S.

Um ponteiro de arquivo é um ponteiro de informações que definem várias coisas sobre o arquivo, como seu nome, status e posição atual.

Basicamente, um ponteiro de arquivo identifica um arquivo específico em disco e é usado pela stream associada para direcionar as operações de E/S.

Declaração de um ponteiro de arquivo:

FILE * fp;

onde: fp é o nome do ponteiro de arquivo. 18

Arquivos Abrindo arquivos

Para abrir um arquivo utiliza-se a função fopen(), que retorna o ponteiro associado a esse arquivo.

Protótipo da função fopen():

FILE *fopen(const char* nomearq, const char* modo);

onde: nomearq é um ponteiro para uma string que forma um nome válido de arquivo; modo é uma string que determina como o arquivo será aberto:

r abre um arquivo-texto para leitura

w abre um arquivo-texto para escrita

rb abre um arquivo binário para leitura

wb abre um arquivo binário para escrita.

19

Arquivos Abrindo arquivos

a anexa um arquivo texto

ab anexa um arquivo binário

r+ abre um arquivo-texto para leitura e escrita

w+ abre um arquivo-texto para leitura e escrita

r+b abre um arquivo binário para leitura e escrita

w+b abre um arquivo binário para leitura e escrita.

a+ anexa um arquivo texto para leitura e escrita

a+b anexa um arquivo binário para leitura e escrita

20

Arquivos Abrindo arquivos

Exemplo: abrindo um arquivo de texto TESTE para escrita:

FILE *fp;

fp = fopen(“TESTE”, “w”);

O código anterior pode ser melhorado com a inclusão de uma verificação de abertura:

if ((fp = fopen(“TESTE”, “w”)) == NULL) {

printf(“O Arquivo não pode ser aberto\n”);

exit(1);

}

21

Arquivos Fechando arquivos

Para fechar um arquivo utiliza-se a função fclose(), que fecha uma stream que foi aberta pode meio de uma chamada a fopen().

Ela escreve qualquer dado que ainda permanece no buffer do disco no arquivo e o fecha normalmente em nível do sistema operacional.

Protótipo da função fclose():

int fclose(FILE *fp);

onde: fp é o ponteiro de arquivo devolvido pela chamada a fopen().

22

Arquivos Escrevendo e lendo caracteres em arquivos

Há duas funções idênticas para escrever caracteres em arquivos são putc() e fputc().

Protótipo da função putc():

int putc(int ch, FILE *fp);

onde: fp é um ponteiro de arquivo aberto para escrita devolvido por fopen(); ch é o caractere a ser escrito.

Se a operação de escrita for bem sucedida, putc() retornará o caractere escrito, caso contrário, devolve EOF.

23

Arquivos Escrevendo e lendo caracteres em arquivos

Há duas funções idênticas para ler caracteres em arquivos são getc() e fgetc().

Protótipo da função getc():

int getc(FILE *fp);

onde: fp é um ponteiro de arquivo aberto para leitura devolvido por fopen().

A função getc() retornará o caractere lido, e devolve EOF quando o final do arquivo for alcançado ou quando ocorre um erro.

24

Arquivos Escrevendo e lendo caracteres em arquivos

Exemplo: programa que escreve em um arquivo de texto os caracteres digitados no teclado, até que o usuário digite um cifrão ($). O nome do arquivo é especificado na linha de comando.

25

Arquivos // Programa para escrever caracteres em arquivo

#include <stdio.h>

#include <stdlib.h>

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

FILE *fp;

char ch;

if (argc != 2) { // verifica se o nome do arquivo foi passado via linha de comando

printf("Erro: nome do arquivo inexistente. \n");

exit(1);

}

if ((fp = fopen(argv[1], "w")) == NULL) { // verifica se o arquivo foi aberto

printf("Erro: o arquivo nao pode ser aberto. \n");

exit(1);

}

(continua)

26

Arquivos do {

ch = getchar(); // lê um caractere do teclado

putc(ch, fp); // escreve no arquivo

}while(ch != '$');

fclose(fp); // fecha o arquivo

system("PAUSE");

return(0);

}

27

Arquivos Escrevendo e lendo caracteres em arquivos

Exemplo: programa que lê um arquivo de texto e exibe os caracteres na tela. O nome do arquivo é especificado na linha de comando.

28

Arquivos // Programa para ler caracteres de arquivo

#include <stdio.h>

#include <stdlib.h>

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

FILE *fp;

char ch;

if (argc != 2) { // verifica se o nome do arquivo foi passado via linha de comando

printf("Erro: nome do arquivo inexistente. \n");

exit(1);

}

if ((fp = fopen(argv[1], "r")) == NULL) { // verifica se o arquivo foi aberto

printf("Erro: o arquivo nao pode ser aberto. \n");

exit(1);

}

(continua)

29

Arquivos ch = getc(fp); // lê um caractere

while (ch != EOF) {

putchar(ch); // exibe na tela

ch = getc(fp);

}

fclose(fp); // fecha o arquivo

system("PAUSE");

return(0);

}

30

Arquivos Escrevendo e lendo strings em arquivos

A funções fputs() efetua a operação de escrita de strings em arquivos.

Protótipos da função fputs():

int fputs(const char *str, FILE *fp);

onde: str é a string a ser escrita no arquivo; fp é o ponteiro de arquivo aberto para escrita devolvido por fopen().

A função fputs() escreve na stream especificada e retorna EOF se ocorrer um erro.

31

Arquivos Escrevendo e lendo strings em arquivos

A funções fgets() efetua a operação de leitura de strings em arquivos.

Protótipos da função fgets():

char *fgets(const char *str, int length, FILE *fp);

onde: str é a string lida no arquivo; length é o tamanho da string; fp é o ponteiro de arquivo aberto para escrita devolvido por fopen().

A função fgets() lê uma string na stream especificada até que um caractere de nova linha seja lido ou que length-1 caracteres tenha sido lidos. Devolve um ponteiro para str ou um ponteiro nulo se ocorrer erro.

32

Arquivos Escrevendo e lendo strings em arquivos

Exemplo: programa que escreve em um arquivo de texto as strings lidas do teclado. Para terminar o programa, deve ser inserida uma linha em branco. O nome do arquivo é especificado na linha de comando.

33

Arquivos // Programa para escrever strings em arquivo

#include <stdio.h>

#include <stdlib.h>

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

FILE *fp;

char str[80];

if (argc != 2) { // verifica se o nome do arquivo foi passado via linha de comando

printf("Erro: nome do arquivo inexistente. \n");

exit(1);

}

if ((fp = fopen(argv[1], "w")) == NULL) { // verifica se o arquivo foi aberto

printf("Erro: o arquivo nao pode ser aberto. \n");

exit(1);

}

(continua)

34

Arquivos do {

printf("Digite uma string (ENTER para sair): \n");

gets(str);

strcat(str, "\n"); // acrescenta uma nova linha

fputs(str, fp); // escreve a string no arquivo

}while(*str != '\n');

fclose(fp); // fecha o arquivo

system("PAUSE");

return(0);

}

35

Arquivos Escrevendo e lendo strings em arquivos

Exemplo: programa que lê em um arquivo de texto strings e as exibe na tela. O nome do arquivo é especificado na linha de comando.

36

Arquivos // Programa para ler strings em arquivo

#include <stdio.h>

#include <stdlib.h>

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

FILE *fp;

char str[80];

if (argc != 2) { // verifica se o nome do arquivo foi passado via linha de comando

printf("Erro: nome do arquivo inexistente. \n");

exit(1);

}

if ((fp = fopen(argv[1], "r")) == NULL) { // verifica se o arquivo foi aberto

printf("Erro: o arquivo nao pode ser aberto. \n");

exit(1);

}

(continua)

37

Arquivos while (!feof(fp)) {

fgets(str, 79, fp); // lê string do arquivo

printf(str); // exibe na tela

}

fclose(fp); // fecha o arquivo

system("PAUSE");

return(0);

}

38

Arquivos Escrevendo e lendo blocos de dados em arquivos

Para escrever tipos de dados maiores que um byte, o sistema de arquivo C ANSI fornece a função fwrite(). Essa função permite a escrita de blocos de qualquer tipo de dado.

Protótipo das funções fwrite():

size_t fwrite(void *buffer, size_t num_bytes, size_t count,

File *fp);

onde: buffer é um ponteiro para as informações que serão escritas no arquivo; num_bytes é o número de bytes a escrever; count determina quantos itens (cada um de comprimento num_bytes) serão escritos; fp é um ponteiro de arquivo aberto para escrita devolvido por fopen().

39

Arquivos Escrevendo e lendo blocos de dados em arquivos

Para ler tipos de dados maiores que um byte, o sistema de arquivo C ANSI fornece a função fread(). Essa função permite a leitura de blocos de qualquer tipo de dado.

Protótipo das funções fread():

size_t fread(void *buffer, size_t num_bytes, size_t count,

File *fp);

onde: buffer é um ponteiro para a região de memória que receberá os dados do arquivo; num_bytes é o número de bytes a ler; count determina quantos itens (cada um de comprimento num_bytes) serão lidos; fp é um ponteiro de arquivo aberto para escrita devolvido por fopen().

40

Arquivos Escrevendo e lendo blocos de dados em arquivos

Exemplo: programa que escreve em um arquivo binário um double, um long e um int. Em seguida, o programa lê o arquivo e exibe os dados na tela.

41

Arquivos // Programa para escrever e ler dados não-caracteres em arquivo

#include <stdio.h>

#include <stdlib.h>

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

FILE *fp;

double d1 = 12.23, d2 = 0;

long l1 = 123023L, l2 = 0;

int i1 = 101, i2 = 0;

if ((fp = fopen("test", "wb+")) == NULL) { // verifica nome do arquivo foi aberto

printf("Erro: o arquivo nao pode ser aberto. \n");

exit(1);

}

printf("Escrevendo os dados ... \n");

(continua)

42

Arquivos fwrite(&d1, sizeof(double), 1, fp); // grava os dados no arquivo

fwrite(&l1, sizeof(long), 1, fp);

fwrite(&i1, sizeof(int), 1, fp);

rewind(fp); // reposiciona indicador de posição de arquivo

fread(&d2, sizeof(double), 1, fp); // lê os dados no arquivo

fread(&l2, sizeof(long), 1, fp);

fread(&i2, sizeof(int), 1, fp);

printf("Dados lidos: %f %ld %d \n", d2, l2, i2);

fclose(fp); // fecha o arquivo

system("PAUSE");

return(0);

}

43

Arquivos Escrevendo e lendo blocos de dados em arquivos

Uma das mais úteis aplicações de fread() e fwrite() envolve ler e escrever tipos de dados definidos pelo usuário, especialmente estruturas.

Por exemplo, dada esta estrutura:

struct struct_type {

float balanco;

char nome[80];

} custo

A sentença a seguir escreve o conteúdo de custo no arquivo apontado por fp:

fwrite(&custo, sizeof(struct struct_type), 1, fp);

44

Arquivos Apagando arquivos

A função remove() apaga o arquivo especificado. Seu protótipo é:

int remove(const char *filename);

onde: filename é uma string contendo o nome do arquivo a ser apagado.

Esvaziando uma stream

Para esvaziar o conteúdo de uma stream de saída, deve-se utilizar a função fflush(). Seu protótipo é:

int fflush(FILE *fp);

onde: fp é o ponteiro de arquivo aberto por fopen().

45

Arquivos Exercícios:

1. Elabore uma função que receba um ponteiro de arquivo, uma string e grave a string no arquivo.

2. Elabore uma função que receba um ponteiro de arquivo, leia uma string no arquivo e retorne a string lida.

3. Elabore um programa que utilize as funções de leitura e gravação de strings para realizar ambas as operações.

4. Com base no programa anterior, elabore um programa que grave e leia em arquivo registros contendo informações de empregados de uma empresa (nome, cargo, setor, salário).

46

Arquivos

Obrigado pela atenção...

e até a próxima aula!

47