Anda di halaman 1dari 47

ALGORITMOS E ESTRUTURAS

DE DADOS I
Leia Nota

Nota<6

sim

Reprovado

no
Nota<7

sim

Recuperao

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

no
Aprovado

Arquivos
SISTEMAS DE INFORMAO - 1o PERODO
UNIMONTES / 2015

Prof. Maurlio J. Incio

Arquivos
Introduo
Armazenar dados em estruturas de dados, tais
como vetores, matrizes ou registros, muito til para
manipular informaes do mundo real.
Entretanto, tais estruturas so sempre manipuladas na
memria principal (RAM), que voltil.
Isto significa que, aps o encerramento do
programa, os dados so perdidos.
Para manter os dados armazenados de forma
persistente necessrio utilizar um meio de
armazenamento no voltil, tais como os discos
magnticos, discos ticos ou outro tipo de memria
no voltil (exemplo: memrias FLASH RAM).

Arquivos
Discos
Atuador

Cabeas de
leitura/gravao

- Vista interna de um disco rgido.


3

Arquivos
CIs de
memria flash

- Vista interna de um disco de estado slido (Solid State Disk SSD).


4

Arquivos
Introduo
Dados so armazenados em disco na forma de
arquivos.
Arquivos tem um nome no sistema operacional e so
agrupados em diretrios ou pastas. A estrutura de
diretrios hierrquica e forma uma rvore.
Arquivos podem ser acessados por meio do caminho,
a partir do diretrio raiz, at o diretrio onde o
arquivo se encontra.
Cada diretrio separado por uma barra (/ nos
sistemas operacionais Unix e Linux, \ nos sistemas
operacionais padro Microsoft). Exemplo:

C:\Disciplinas 2011\AEDI\Alunos\Notas

Arquivos
Diretrio raiz
\

Disciplinas 2010

AEDI

Arquivos

Disciplinas 2011

AEDII

AEDI

- Exemplo de rvore de diretrios.

AEDII

Arquivos
Introduo
Pode-se manipular os dados armazenados em
arquivos por meio do prprio sistema operacional,
que possui rotinas para criar, abrir, ler, gravar e
fechar arquivos.
As linguagens de programao so 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 manipulao de arquivos nos programas feita por
meio de algumas funes bsicas.

Arquivos
Introduo
Quando um programa executado, este tem acesso
ao diretrio corrente (diretrio onde programa esta
armazenado).
Neste caso, o programa no precisa indicar o caminho
para acessar arquivos do mesmo diretrio.
Caso os arquivos estejam em outro diretrio, 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 diretrio
corrente, exemplo:
..\AEDI\Alunos\Notas

Arquivos
Sistema de E/S em C
A linguagem C no possui nenhum comando de E/S.
Ao contrrio, todas operaes de E/S ocorrem
mediante chamadas a funes da biblioteca
padro.
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
nvel de abstrao entre o programador e o
dispositivo utilizado.
Esta abstrao chamada de stream e o
dispositivo real chamado de arquivo.

Arquivos

Streams

10

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
lgico chamado stream.
Todas as streams se comportam de forma
semelhante.
Pelo fato de serem independentes do dispositivo, a
mesma funo pode escrever em um arquivo em
disco ou em outro dispositivo, como o console.
Existem dois tipos de streams: texto e binria.

Arquivos

Streams
Stream de texto uma sequncia de caracteres.

11

O padro C ANSI permite (mas no 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 implementao (a maioria dos
compiladores C no termina streams de texto com
caracteres de nova linha)
Em uma stream de texto, certas tradues podem
ocorrer conforme exigido pelo sistema host, podendo
no haver uma relao de um para um entre os
caracteres lidos/escritos e aqueles no dispositivo real.

Arquivos

Streams
Stream binria uma sequncia de bytes com

12

uma correspondncia um para um com aqueles


encontrados no dispositivo real (no ocorre traduo
de caracteres como na stream de texto).
Em streams binrias, o nmero de bytes lidos ou
escritos o mesmo que o encontrado no dispositivo
real.
Dependendo da implementao, um nmero de bytes
nulos pode ser acrescentado a uma stream binria.
Esses bytes nulos podem ser usados para aumentar a
informao de forma que ela preenchesse um
setor do disco, por exemplo.

Arquivos

Arquivos em C
Em C, um arquivo pode ser qualquer coisa, desde
um arquivo em disco at um terminal ou
impressora.
A associao entre uma stream como o arquivo
especifico realizada numa operao de abertura.
Uma vez que o arquivo esteja aberto, as informaes
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 so iguais, mas no todos os arquivos).
Um arquivo que suporta acesso aleatrio possui um
indicador de posio no arquivo.
13

Arquivos

Arquivos em C
Um arquivo desassociado de uma stream especfica
por meio de uma operao de fechamento.
No fechamento do arquivo, se houver algum
contedo, os dados sero escritos no dispositivo
externo (processo denominado flushing).
Todos os arquivos so fechados quando o programa
termina normalmente. Se houver uma terminao
inesperada do programa (crash) ou uma chamada a
funo abort(), os arquivos no sero fechados.
Cada stream associada a um arquivo tem uma
estrutura de controle de arquivo tipo FILE (definida
em STDIO.H).
14

Arquivos

Funes do sistema de arquivos


O sistema de arquivos C ANSI composto de
diversas funes apresentadas a seguir.
Essas funes exigem que o cabealho STDIO.H seja
includo em qualquer programa em que sero
utilizadas.
A maioria das funes comea com a letra f, uma
conveno herdada do padro C UNIX.
STDIO.H fornece os prottipos para as funes e
define trs tipos: size_t, fpos_t e FILE.
STDIO.H tambm define vrias macros, sendo as mais
relevantes: NULL, EOF, FOPEN_MAX, SEEK_SET,
SEEK_CUR, SEEK_END.
15

Arquivos

Funes do sistema de arquivos


Nome

fopen()
fclose()
fputc()
fgetc()
fputs ()
fgets()
fseek()

Funo
Abre um arquivo.

Fecha um arquivo.
Escreve um caractere em um arquivo.
L um caractere de um arquivo.
Escreve uma string em um arquivo.
L uma string de um arquivo.
Posiciona o arquivo em um byte especfico.

fprintf()

para um arquivo o que printf() para o


console.

fscanf()

para um arquivo o que scanf() para o


console.

16

Arquivos

Funes do sistema de arquivos


Nome

Funo

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 posio de arquivo no


incio do arquivo

remove()
fflush()
17

Apaga um arquivo.
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
informaes que definem vrias coisas sobre o
arquivo, como seu nome, status e posio atual.
Basicamente, um ponteiro de arquivo identifica um
arquivo especfico em disco e usado pela stream
associada para direcionar as operaes de E/S.
Declarao de um ponteiro de arquivo:
FILE * fp;

18

onde: fp o nome do ponteiro de arquivo.

Arquivos

Abrindo arquivos
Para abrir um arquivo utiliza-se a funo fopen(),
que retorna o ponteiro associado a esse arquivo.
Prottipo da funo fopen():
FILE *fopen(const char* nomearq, const char* modo);

19

onde: nomearq um ponteiro para uma string que forma


um nome vlido 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 binrio para leitura
wb
abre um arquivo binrio para escrita.

Arquivos

Abrindo arquivos

20

a
ab
r+
w+
r+b
w+b
a+
a+b

anexa um arquivo texto


anexa um arquivo binrio
abre um arquivo-texto para leitura e escrita
abre um arquivo-texto para leitura e escrita
abre um arquivo binrio para leitura e escrita
abre um arquivo binrio para leitura e escrita.
anexa um arquivo texto para leitura e escrita
anexa um arquivo binrio para leitura e escrita

Arquivos

Abrindo arquivos
Exemplo: abrindo um arquivo de texto TESTE para
escrita:
FILE *fp;
fp = fopen(TESTE, w);

O cdigo anterior pode ser melhorado com a incluso


de uma verificao de abertura:
if ((fp = fopen(TESTE, w)) == NULL) {
printf(O Arquivo no pode ser aberto\n);
exit(1);
}

21

Arquivos

Fechando arquivos
Para fechar um arquivo utiliza-se a funo 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
nvel do sistema operacional.
Prottipo da funo fclose():
int fclose(FILE *fp);

22

onde: fp o ponteiro de arquivo devolvido pela chamada


a fopen().

Arquivos

Escrevendo e lendo caracteres em arquivos


H duas funes idnticas para escrever caracteres em
arquivos so putc() e fputc().
Prottipo da funo putc():
int putc(int ch, FILE *fp);

23

onde: fp um ponteiro de arquivo aberto para escrita


devolvido por fopen(); ch o caractere a ser escrito.

Se a operao de escrita for bem sucedida, putc()


retornar o caractere escrito, caso contrrio, devolve
EOF.

Arquivos

Escrevendo e lendo caracteres em arquivos


H duas funes idnticas para ler caracteres em
arquivos so getc() e fgetc().
Prottipo da funo getc():
int getc(FILE *fp);

24

onde: fp um ponteiro de arquivo aberto para leitura


devolvido por fopen().

A funo getc() retornar o caractere lido, e devolve


EOF quando o final do arquivo for alcanado ou
quando ocorre um erro.

Arquivos

Escrevendo e lendo caracteres em arquivos


Exemplo: programa que escreve em um arquivo de
texto os caracteres digitados no teclado, at que o
usurio digite um cifro ($). 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);
}
26

(continua)

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

(continua)

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 funes fputs() efetua a operao de escrita de
strings em arquivos.
Prottipos da funo fputs():
int fputs(const char *str, FILE *fp);

31

onde: str a string a ser escrita no arquivo; fp o


ponteiro de arquivo aberto para escrita devolvido por
fopen().

A funo fputs() escreve na stream especificada e


retorna EOF se ocorrer um erro.

Arquivos

Escrevendo e lendo strings em arquivos


A funes fgets() efetua a operao de leitura de
strings em arquivos.
Prottipos da funo fgets():
char *fgets(const char *str, int length, FILE *fp);

32

onde: str a string lida no arquivo; length o tamanho


da string; fp o ponteiro de arquivo aberto para escrita
devolvido por fopen().

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

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

(continua)

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

(continua)

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 funo
fwrite(). Essa funo permite a escrita de blocos de
qualquer tipo de dado.
Prottipo das funes fwrite():
size_t fwrite(void *buffer, size_t num_bytes, size_t count,
File *fp);

39

onde: buffer um ponteiro para as informaes que sero


escritas no arquivo; num_bytes o nmero de bytes a
escrever; count determina quantos itens (cada um de
comprimento num_bytes) sero escritos; fp um ponteiro
de arquivo aberto para escrita devolvido por fopen().

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 funo fread().
Essa funo permite a leitura de blocos de qualquer
tipo de dado.
Prottipo das funes fread():
size_t fread(void *buffer, size_t num_bytes, size_t count,
File *fp);

40

onde: buffer um ponteiro para a regio de memria que


receber os dados do arquivo; num_bytes o nmero de
bytes a ler; count determina quantos itens (cada um de
comprimento num_bytes) sero lidos; fp um ponteiro de
arquivo aberto para escrita devolvido por fopen().

Arquivos

Escrevendo e lendo blocos de dados em arquivos


Exemplo: programa que escreve em um arquivo
binrio 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 no-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");

42

(continua)

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 posio 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 aplicaes de fread() e fwrite()
envolve ler e escrever tipos de dados definidos pelo
usurio, especialmente estruturas.
Por exemplo, dada esta estrutura:
struct struct_type {
float balanco;
char nome[80];
} custo

A sentena a seguir escreve o contedo de custo no


arquivo apontado por fp:
fwrite(&custo, sizeof(struct struct_type), 1, fp);

44

Arquivos

Apagando arquivos
A funo remove() apaga o arquivo especificado. Seu
prottipo :
int remove(const char *filename);

onde: filename uma string contendo o nome do arquivo


a ser apagado.

Esvaziando uma stream


Para esvaziar o contedo de uma stream de sada,
deve-se utilizar a funo fflush(). Seu prottipo :
int fflush(FILE *fp);

45

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

Arquivos

Exerccios:
1. Elabore uma funo que receba um ponteiro de
arquivo, uma string e grave a string no arquivo.
2. Elabore uma funo que receba um ponteiro de
arquivo, leia uma string no arquivo e retorne a string
lida.
3. Elabore um programa que utilize as funes de
leitura e gravao de strings para realizar ambas as
operaes.
4. Com base no programa anterior, elabore um
programa que grave e leia em arquivo registros
contendo informaes de empregados de uma
empresa (nome, cargo, setor, salrio).
46

Arquivos

Obrigado pela ateno...


e at a prxima aula!

47

Anda mungkin juga menyukai