47
Arquivos SISTEMAS DE INFORMAÇÃO - 1 o 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

Algoritimo e Extrutura de dados

Embed Size (px)

DESCRIPTION

aula sobre algoritmo e extrura de dados cap I

Citation preview

Page 1: 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

Page 2: Algoritimo e Extrutura de dados

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

Page 3: Algoritimo e Extrutura de dados

Arquivos

3

- Vista interna de um disco rígido.

Atuador

Discos

Cabeças de leitura/gravação

Page 4: Algoritimo e Extrutura de dados

Arquivos

4

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

CI’s de memória flash

Page 5: Algoritimo e Extrutura de dados

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

Page 6: Algoritimo e Extrutura de dados

Arquivos

6

Diretório raiz \

Disciplinas 2010 Disciplinas 2011

AEDI AEDII AEDI AEDII

- Exemplo de árvore de diretórios. Arquivos

Page 7: Algoritimo e Extrutura de dados

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

Page 8: Algoritimo e Extrutura de dados

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

Page 9: Algoritimo e Extrutura de dados

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

Page 10: Algoritimo e Extrutura de dados

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

Page 11: Algoritimo e Extrutura de dados

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

Page 12: Algoritimo e Extrutura de dados

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

Page 13: Algoritimo e Extrutura de dados

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

Page 14: Algoritimo e Extrutura de dados

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

Page 15: Algoritimo e Extrutura de dados

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

Page 16: Algoritimo e Extrutura de dados

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.

Page 17: Algoritimo e Extrutura de dados

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.

Page 18: Algoritimo e Extrutura de dados

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

Page 19: Algoritimo e Extrutura de dados

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

Page 20: Algoritimo e Extrutura de dados

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

Page 21: Algoritimo e Extrutura de dados

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

Page 22: Algoritimo e Extrutura de dados

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

Page 23: Algoritimo e Extrutura de dados

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

Page 24: Algoritimo e Extrutura de dados

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

Page 25: Algoritimo e Extrutura de dados

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

Page 26: Algoritimo e Extrutura de dados

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

Page 27: Algoritimo e Extrutura de dados

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

Page 28: Algoritimo e Extrutura de dados

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

Page 29: Algoritimo e Extrutura de dados

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

Page 30: Algoritimo e Extrutura de dados

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

Page 31: Algoritimo e Extrutura de dados

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

Page 32: Algoritimo e Extrutura de dados

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

Page 33: Algoritimo e Extrutura de dados

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

Page 34: Algoritimo e Extrutura de dados

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

Page 35: Algoritimo e Extrutura de dados

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

Page 36: Algoritimo e Extrutura de dados

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

Page 37: Algoritimo e Extrutura de dados

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

Page 38: Algoritimo e Extrutura de dados

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

Page 39: Algoritimo e Extrutura de dados

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

Page 40: Algoritimo e Extrutura de dados

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

Page 41: Algoritimo e Extrutura de dados

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

Page 42: Algoritimo e Extrutura de dados

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

Page 43: Algoritimo e Extrutura de dados

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

Page 44: Algoritimo e Extrutura de dados

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

Page 45: Algoritimo e Extrutura de dados

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

Page 46: Algoritimo e Extrutura de dados

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

Page 47: Algoritimo e Extrutura de dados

Arquivos

Obrigado pela atenção...

e até a próxima aula!

47