Você está na página 1de 40

Algoritmos e Programao

Tema 7: MANIPULAO DE
ARQUIVOS TEXTO

Prof. Dany S. Dominguez


dsdominguez@gmail.com
Sala 1 NBCGIB
(73) 3680 5212 ramal 30
Roteiro
Motivao
Arquivos texto vs Arquivos binrios
Arquivos e fluxos
Fluxos automticos
Declarando fluxos
Abrindo arquivos
Fechando arquivos
Escrita e leitura em arquivos de acesso seqencial
Limitaes dos arquivos de acesso seqencial
Motivao
As variveis de um programa so
armazenadas na memria dinmica do
computador (memria principal ou RAM),
Porem, o armazenamento de dados em
variveis temporrio,
Todos os dados so perdidos quando o
programa termina,
Para resolver este problema dispositivos de
armazenamento definitivo devem ser utilizados.
Motivao
Arquivos so utilizados para armazenamento
permanente dos dados,
Arquivos so gravados na memria esttica do
computador (memria secundaria, discos,
flash)
Os arquivos podem ser classificados como
arquivos ASCII (texto) ou arquivos binrios.
Arquivos texto (ASCII)

Utilizam a representao ASCII para


armazenar os dados (caracteres ASCII),

so legveis por humanos,

podem ser lidos e interpretados diretamente,

Apresentam acesso seqencial.


Arquivos binrios

Armazenam os dados em sua representao


binria interna (zeros e uns, ou outras
codificaes),

no so legveis por humanos,

arquivos binrios devem ser interpretados por


mquinas (Ex. computadores),

permitem acesso aleatrio.


Introduo
O sistema de arquivos da linguagem C
extremamente poderoso e flexvel,
Permite trabalhar com arquivos binrios e
arquivos texto,
possvel criar arquivos que satisfazem
qualquer necessidade,
O trabalho com arquivos em C considerado
operaes de E/S.
Arquivos e fluxos (Streams)
O sistema de arquivos da linguagem C prev a
interao entre trs entidades:
o programa em C,
o arquivo,
e um dispositivo lgico chamado de fluxo ou
streams
Fluxo ou Stream

Arquivo
Programa (Dispositivo
(Cdigo C) Fsico)
Arquivos e fluxos (Streams)
A linguagem C fornece uma interfase que
independe do dispositivo real que acessado,
Prov ao programador um nvel de abstrao
entre seu programa e o arquivo que esta sendo
acessado,
O sistema de arquivos de C projetado para
trabalhar com uma ampla variedade de
dispositivos: terminais, impressoras, discos,
memrias flash, fitas.
Arquivos e fluxos (Streams)
Embora existam grandes diferencias entre os
dispositivos,
Todos eles so transformados no mesmo
dispositivo lgico (fluxo),
Para o programador todos os fluxos tem o
mesmo comportamento,
Existem dois tipos de fluxos:
fluxos de texto
fluxos binrios
Fluxos de texto
Um fluxo de texto uma seqncia de
caracteres,
Normalmente o fluxo organizado em um
conjunto de linhas que terminam no caractere
nova linha,
Dependendo do conjunto de caracteres do
sistema podem ocorrer tradues nos
caracteres,
Podem existir diferencias entre a informao
lida ou escrita (no fluxo) e a informao
presente no dispositivo externo.
Fluxos binrios

Um fluxo binrio uma seqncia de bytes,

Existe uma total correspondncia entre os


dados (lidos ou escritos) e o dispositivo
externo,

No ocorre nenhuma traduo de caracteres.


Arquivos e fluxos (Streams)
Em C, um arquivo pode ser qualquer
dispositivo (arquivo em disco, terminal ou
teclado),
Um fluxo associado a um arquivo com uma
operao de abertura de arquivo,
Uma vez aberto o arquivo informaes podem
ser trocadas entre ele e seu programa,
Nem todos os arquivos apresentam os mesmos
recursos (Ex: acesso aleatrio (disco = sim),
(teclado = no))
Arquivos e fluxos (Streams)
No sistema de arquivos de C, todos os fluxos
so iguais, mas no todos os arquivos,
A linguagem C visualiza cada arquivo como um
fluxo seqencial de bytes:

0 1 2 3 4 5 6 ... n-1
marcador de
... fim de arquivo

Cada arquivo termina com um marcador final


de arquivo.
Arquivos e fluxos (Streams)
O sistema de arquivos de C, um sistema com
buffer (armazenamento temporrio),
O intercambio de informao entre o fluxo e o
arquivo no acontece em forma continua,
A informao armazenada no fluxo at que
um determinado tamanho de bloco seja
alcanado, ento o bloco transferido para o
arquivo,
O uso do buffer aumenta o desempenho do
sistema de arquivos.
Arquivos e fluxos (Streams)
Um arquivo desassociado de um fluxo
mediante uma operao de fechamento,
Quando um arquivo fechado, o contedo (se
houver) do fluxo associado escrito no
dispositivo externo,
Esse processo conhecido como descarga
(flushing) do fluxo,
Garantindo que nenhuma informao seja
acidentalmente deixada no fluxo.
Fluxos automticos
Trs arquivos e seus respectivos fluxos so
abertos automaticamente quando inicia a
execuo de um programa:
entrada padro (stdin) ligado ao teclado,
sada padro (stdout) ligado tela,
sada de erro padro (stderr) ligado tela.
Estes fluxos permitem a interao do usurio
com o programa,
Fluxos automticos
Os fluxos automticos apresentam o mesmo
comportamento que os outros fluxos,
Eles podem ser utilizados como parmetros de
fluxo em qualquer funo de C,
Eles no podem ser abertos ou fechados
manualmente (programa),
Eles podem ser redirecionados para outros
arquivos,
Eles so fechados automaticamente ao
finalizar a execuo do programa.
Declarando fluxos (Streams)
Um fluxo declarado como um ponteiro a uma
estrutura do tipo FILE,
A estrutura FILE definida no arquivo de
cabealho <stdio.h>,
E contem as informaes necessrias para
processar o arquivo:
descritor de arquivos: ndice para a tabela de
arquivos abertos do sistema operacional,
BCA: bloco de controle de arquivos,
indicador de posio no arquivo (cursor).
Abrindo arquivos (Streams)
Declaramos um fluxo (ponteiro a arquivo):
FILE *PFile

Para abrir um arquivo usamos a funo fopen()


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

A funo fopen() abre um fluxo para uso e


associa um arquivo a ela,
fopen() retorna um ponteiro a arquivo ou NULL
se a operao falha.
Abrindo arquivos (Streams)
fopen() recebe dois argumentos:
nomearq, um ponteiro para uma cadeia de
caracteres que representa um nome de
arquivo vlido (pode incluir caminho),
modo, uma cadeia de caracteres que
determina como o arquivo ser aberto.
O modo determina as operaes que podero
ser feitas com o arquivo.
Abrindo arquivos (Streams)
Modo Significado
r Abre um arquivo-texto para leitura
w Cria um arquivo-texto para escrita
a Anexa a um arquivo-texto
rb Abre um arquivo binrio para leitura
wb Cria um arquivo binrio para escrita
ab Anexa a um arquivo binrio
r+ Abre um arquivo-texto para leitura/escrita
w+ Cria um arquivo-texto para escrita/leitura
a+ Anexa a um arquivo-texto/escrita
rb+ Abre um arquivo binrio para leitura/escrita
wb+ Cria um arquivo binrio para escrita/escrita
ab+ Anexa a um arquivo binrio/escrita
Abrindo arquivos (Streams)
Modos de abertura de arquivo:
r, abre um arquivo para leitura, o cursor
colocado no inicio do arquivo,
w, cria um arquivo para escrita, se o arquivo
existe toda a informao apagada,
a, abre um arquivo para escrita, se o arquivo
existe a informao mantida, o cursor
colocado no final do arquivo,
b, refere-se a arquivos binrios
+, permite realizar operaes de leitura e
escrita no mesmo fluxo.
Abrindo arquivos (Streams)

O sucesso de fopen() deve ser verificado


antes de realizar qualquer outra operao
sobre o arquivo,
Prevendo erros como: disco cheio, arquivo
protegido, arquivo inexistente, ...
Fechando arquivos (Streams)
Para fechar um arquivo usamos fclose()
int fclose(FILE *fp)

A funo fclose() libera o fluxo associado ao


arquivo deixando-o disponvel para ser
utilizado,
Existe um limite do sistema operacional para o
nmero de arquivos abertos simultaneamente,
Feche um arquivo quando no for mais usar-lo,
Os dados no buffer do fluxo so descarregados
ao arquivo antes de liberar-lo.
Fechando arquivos (Streams)
A funo fclose() retorna um inteiro,
Um valor zero no retorno indica que o
fechamento foi bem sucedido,
Qualquer valor diferente de zero indica um erro
Verificao de fim de arquivo
Para verificar se o fim de um arquivo foi
alcanado usamos feof()
int feof (FILE *fp);

A funo feof() retorna verdadeiro (diferente


de 0) se o final do arquivo foi alcanado, caso
contrario retorna falso (0),
O parmetro de feof() o fluxo para o qual
desejamos verificar o fim de arquivo,
Verificao de fim de arquivo
A funo feof() utilizada quando realizamos
leitura de arquivos,
feof() pode ser utilizado com o fluxo de
entrada padro stdin,
Para simular o indicador de fim de arquivo via
teclado usamos a combinao de teclas
<ctrl>z.
Exemplo
FILE *fp;
if ((fp = fopen(teste.txt, r))==NULL){
printf(Erro ao abrir o arquivo!!!\n);
exit(1);
}
while(!feof(fp)){
//processa os elementos do arquivo
}

fclose(fp);

Fluxo (fp)

Arquivo
Programa (Dispositivo
(Cdigo C) Fsico)
Arquivos de acesso seqencial
O acesso seqencial a arquivos esta
intimamente relacionado ao uso de arquivos
textos,
A linguagem C no impe estrutura a um
arquivo,
O programador deve fornecer qualquer
estrutura de arquivos visando satisfazer as
exigncias de uma aplicao especfica,
A escrita em arquivos seqenciais similar a
escrita na tela.
Escrita - arquivos de acesso seqencial
int fprintf(FILE *fp, const char *format, variaveis);

Similar a funo printf(),


Escreve no fluxo especificado e avana o
cursor do arquivo,
O primeiro argumento o fluxo de escrita,

int fputc(int ch, FILE *fp);

Similar a funo putc(),


Escreve o caractere ch no fluxo fp e avana
o cursor um caractere.
Escrita - arquivos de acesso seqencial
int fputs(const char *str, FILE *fp);

Similar a funo puts(),


Escreve a string str no fluxo fp e avana o
cursor at o final do arquivo

Exemplo: Crie um programa que leia uma


matriz quadrada de dimenso indicada pelo
usurio e armazene a matriz no arquivo
matriz.txt
Exemplo
Estrutura do arquivo de sada
Dimensao da Matriz A - n
a[0][0] a[0][1] a[0][2] . . . a[0][n-1]
a[1][0] a[1][1] a[1][2] . . . a[1][n-1]
. . . . . .
a[n-1][0] a[n-1][1] a[n-1][2] . . . a[n-1][n-1]

Arquivo: escreve_seq.c
Funes necessrias
void ler_matriz_teclado(float m[][N], int n);

void escrever_matriz_arquivo(float m[][N],


int n, FILE *fp);
Leitura - arquivos de acesso seqencial
int fscanf(FILE *fp, const char *format, variaveis);

Similar a funo scanf(),


L dados no fluxo especificado (fp) e
avana o cursor do arquivo,
O primeiro argumento o fluxo para leitura,

int fgetc(FILE *fp);

Similar a funo getc(),


Retorna o primeiro caractere do fluxo fp e
avana o cursor um caractere.
Leitura - arquivos de acesso seqencial
char * fgets(const char *str, int num, FILE *fp);
Similar a funo gets(),
L no mximo num-1 caracteres no fluxo fp
e os coloca na cadeia de caracteres str,
Avana o cursor de arquivo num-1
caracteres.

Exemplo: Crie um programa que leia e mostre


na tela o contedo do arquivo matriz.txt
criado no exemplo anterior.
Exemplo
Arquivo: leitura_seq.c

Funes necessrias

int ler_matriz_arquivo(float m[][N],


FILE *fp);

void prn_matriz_tela(float m[][N], int n);


Arquivos de acesso seqencial
Outras funes:
int fflush(FILE *fp);

Descarga o contedo do buffer do fluxo


para o arquivo,
Recebe como parmetro o fluxo de arquivo,
Uma chamada com parmetro NULL
descarga o fluxo em todos os arquivos
abertos,
Quando um arquivo fechado, uma
chamada a fflush() feita.
Arquivos de acesso seqencial
Outras funes:
void rewind(FILE *fp);

Posiciona o cursor do arquivo no incio do


arquivo,
Recebe como parmetro o fluxo de arquivo.
Limitaes - acesso seqencial
Que acontece no arquivo matriz.txt se
tentarmos modificar um elemento intermdiario
da matriz?

Qual seria o tempo de acesso ao primeiro


elemento?

Qual seria o tempo de acesso ao ltimo


elemento?
Limitaes - acesso seqencial
Impossvel modificar registros intermdios sem
afetar outros registros,
O tempo de acesso a um registro depende da
posio do registro no arquivo,
A leitura (escrita) de um conjunto de registros
feita um registro de cada vez (vetor de
registros).
Uma alternativa as limitaes dos arquivos de
acesso sequencial so os arquivos de acesso
aleatrio.

Você também pode gostar