Buscar

Manipulação de Arquivos em C

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 37 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 37 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 37 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Manipulação de Arquivos com 
a 
Linguagem C
Manipulação de Arquivos em C
¾Introdução Geral sobre Arquivos
¾ Arquivos Formatados – Alto Nível (texto)
ƒ Conceitos básicos
¾ Arquivos Formatados – Baixo Nível (binário)
ƒ Funções básicas
ƒ Exemplos de programas 
ƒmanipulação de caracteres, strings, dados numéricos;
ƒ Exercícios
ƒ Funções básicas
ƒ Exemplos de programas
ƒ manipulação de dados numéricos e structs 
ƒ Exercícios
Bits
Caractere
(byte)
Campos
Estruturas
Files
Banco de Dados
Hierarquia com a Organização dos Dados
Introdução Geral a Arquivos
Analogia entre Memórias Primária e Secundária 
(Máquinas Desktop) 
¾ Volátil
Memória Primária (RAM)
Ç Velocidade (Alta Æ 104 >)
Ç Custo (Alto)
¾ Persistência
È Custo (Baixo)
È Capacidade (256-512Mb/ 1-3 Gb)
È Velocidade (Baixa)
Ç Capacidade (102,103, 104 Gb)
Memória Secundária
(Dispositivos externos)
Introdução Geral a Arquivos
Vamos introduzir conceitos associados a arquivos sob uma perspectiva 
geral, para em seguida particularizar para a Linguagem C.
Arquivos (digitais) em geral são de fundamental importância em nossas 
vidas. Eles são usados cotidianamente para armazenar:
¾ Programas de computadores;
¾ Diferentes tipos de documentos;
¾ Imagens fotos, nossos e.mails ;
¾ Infinidade de outras informações, ... 
A qualquer momento podemos executar (executáveis), acrescentar novos 
dados e recuperar os dados existentes em um arquivo que temos acesso.
Introdução Geral a Arquivos
Arquivo: Conjunto (coleção) de dados relacionados (caracteres, inteiros, 
registros(structs), ...) e armazenados num dispositivo físico (externo) (fitas, 
hd´s, USB Flash Drives (pendrives) disquetes (?????), Cd´s, DVD´s, etc). 
É interessante observar que os SO´s e as modernas Linguagens de 
Programação tratam os dispositivos físicos de entrada (teclado, ...) e de 
saída (monitor, impressora, ...) como se fossem arquivos. Para o SO (baixo 
nível) um arquivo é algo um pouco mais complexo, mas não precisamos 
nos preocupar com estes detalhes.
Conceito lógico usado para compartimentalizar dispositivos físicos externos 
de armazenamento nos quais diferentes tipos de dados podem ser 
preservados para futuras operações sobre eles. Num alto nível, para nós 
usuários um arquivo nada mais é do que um nome associado a uma área 
de memória num dispositivo externo.
Introdução Geral a Arquivos
Uma outra idéia fundamental associada a arquivos é a capacidade de armazenar 
grandes quantidades/volumes de dados ligadas a aplicações científicas, comerciais, 
etc, do mundo real e recuperar estes dados em qualquer momento no futuro.
¾Engenharias (civil, automobilística, aeronáutica, ...)
¾Dados metereológicos, pluviométricos, geológicos, ...;
¾Imagens de satélites, médicas, ... 
¾Cadastros de clientes ligados a instituições bancárias, ...; 
Conjunto de dados da ordem de dezenas, centenas, milhares de megabytes . 
Na verdade, o tamanho dos arquivos está limitado a capacidade do dispositivo 
físico de armazenamento.
(google possui dados armazenados da ordem de centenas de terabytes = 
1012).
Facilita a troca de informações entre diferentes computadores.
¾Dados pessoais de funcionários ligados a grandes empresas, ...; 
Introdução Geral a Arquivos
Arquivos
Tipicamente o que nós fazemos é usar alguns aplicativos (Word, Excell, 
Explorer, Dev-C++, ...) para criar novos arquivos, abrir arquivos existentes, 
gravar novos dados nestes arquivos e salvá-los para serem usados em 
outro momento. Todo gerenciamento do processo é feito pelo 
aplicativo, com o auxílio do SO.
Aplicativos
Leitura
Escrita
Introdução Geral a Arquivos
A partir de agora queremos desenvolver programas na 
linguagem C que sejam capazes de manipular arquivos 
(abrir, criar, acrescentar, copiar, remover, fechar, ...). 
Introdução Geral a Arquivos
Arquivos
Programas
Nível Físico (impressoras, ... , teclados, 
arquivos em dispositivos externos de 
armazenamento)
Nível Lógico (programas)
A comunicação entre programas e arquivos se dá através 
de um conceito (abstração) referenciado por streams
(fluxos) que podem ser do tipo binário ou do tipo texto, 
ou seja, arquivos podem ser classificados em dois tipos.
Representação diagramática para facilitar a compreensão do conceito de streams.
Introdução Geral a Arquivos
Na verdade, uma streams nada mais é do que uma seqüência de 
caracteres do tipo texto ou do tipo binário. O conceito de streams
elimina a necessidade de tratar diretamente com o arquivo.
Introdução Geral a Arquivos
Em outras palavras, não interessa se o arquivo é uma impressora, 
teclado ou monitor, ou ainda, se o dispositivo físico de 
armazenamento é ótico ou magnético, enfim, qual a tecnologia 
envolvida.
Sintetizando, o conceito de streams permite a abstração necessária 
para tratar com arquivos em quaisquer dispositivos.
Acesso Randômico/Aleátório:
O tempo de acesso a componente que está na posição 1, 100, 1000 ou 
100000 é constante, ou seja, é independente de sua posição.
Este tipo de acesso ocorre por exemplo quando manipulamos estruturas do 
tipo arranjo/agregado homogêneo/vetor (array).
...
1
100000
i
Introdução Geral a Arquivos
Acesso Seqüencial: Imagem (simples) para facilitar a compreensão do conceito.
Como acessar a 
informação que está
nesta posição?
Cabeçote de leitura/gravação:
Fita
Introdução Geral a Arquivos
Síntese da Idéia do Acesso Seqüencial:
O tempo de acesso a cada componente depende de sua posição, ou seja, para 
acessar a componente localizada na posição i, é necessário passar pela 
componente que está na posição (i-1).
Este tipo de acesso ocorre por exemplo quando manipulamos estruturas de 
arquivos em fitas magnéticas (estão meio fora de moda) como ilustrado na figura 
anterior
A linguagem C possibilita (encapsula) o acesso randômico a 
arquivos (dispositivos físicos de armazenamento) através de funções 
específicas.
Introdução Geral a Arquivos
Streams (fluxos) do Tipo Texto (Alto Nível):
No modo texto os dados (caracteres, cadeias de caracteres, numéricos) são 
manipulados como uma seqüência de caracteres ASCII e são devidamente 
convertidos no momento das operações de leitura/escrita. 
O formato interno (dados formatados) é facilmente verificável. É o formato 
mais neutro que existe e qualquer aplicativo consegue abrir um arquivo 
texto. Alguns formatos do tipo texto mais conhecidos, são: Æ html, pas, C, 
C++, ps, eps, tex, m.
Observem que o termo “texto”, não se refere apenas a arquivos que 
manipulam somente texto (caracteres). Eles são capazes de manipular 
igualmente arquivos com dados numéricos (inteiros, reais em notação 
decimal e exponencial).
Introdução Geral a Arquivos
Representação dos dados em disco (físico) e na memória podem ser de 
tamanhos diferentes se envolver dados numéricos.
A a b \n
1 123 123456 \n
1.12345678
Arquivo em disco
6 bytes são usados 
para a representação 
em disco
Geralmente números 
inteiros são representados 
internamente por 4 bytes 
(ambientes de 32 bits)
Memória do computador
1001...001
Cada byte em disco (arquivo texto) não corresponde necessariamente a 1 byte 
na memória interna.
Streams (fluxos) do Tipo Texto (Alto Nível):
Introdução Geral a Arquivos
Streams (Fluxos) do Tipo Binário (Baixo Nível):
Por outro lado, representar este mesmo número no formato texto requer 
(184 bits = 23 bytes) em disco, um byte por caractere.
Cada byte em disco (arquivo binário) corresponde necessariamente a 1 byte 
na memória interna.
Representar um número real (ponto flutuante em notação exponencial) em disco 
e na memória principal do tipo ±d.ddddddddddddddddE±dd no formato 
binário requer (64 bits = 8 bytes), já que é representado através de um 
double (talvez 10 bytes em alguns compiladores). 
Introdução Geral a Arquivos
Para manipular dados no formato binário, você deve conhecer previamente 
como eles estão organizados internamente no arquivo em disco, ou seja, 
qual o formato foi usado. 
Streams (Fluxos) do Tipo Binário (Baixo Nível):A representação em disco (físico) e na memória interna é
exatamente a mesma. Cada byte no arquivo externo corresponde 
a exatamente um byte na memória primária, em outras palavras, 
existe uma correspondência biunívoca.
Arquivos binários (formatos proprietários) contêm seqüências de 
caracteres com significado especial, como por exemplo, os códigos de 
controle de um editor de texto (Word), etc. Tente abrir um arquivo.doc no 
Dev-C++ ou no Notepad.
Introdução Geral a Arquivos
¾Arquivos binários são mais rápidos (não há conversão de dados), porém são 
fortemente dependentes de máquinas (hardware) e também de software. Pode 
ocorrer dificuldades de portabilidade. A representação interna pode variar entre as 
diferentes arquiteturas de computadores;
¾Operações de E/S em arquivo do tipo texto são “buferizadas”, ou seja, os dados 
são transferidos para uma memória auxiliar e são transferidos ao programa somente 
quando a tecla Enter é pressionada ou o caractere de nova linha é encontrado (‘\n’);
Algumas características entre as duas formas:
¾Arquivos binários usam menos espaço em disco que seus correspondentes 
arquivos do tipo texto;
Introdução Geral a Arquivos
Algumas características entre as duas formas:
“buffer” é uma área de memória principal que é usada para facilitar a transferência 
de dados entre dispositivos físicos (externos) em operações de I/O e o programa, 
para compatibilizar problemas de velocidades entre os dispositivos. 
¾A troca de arquivos entre diferentes programas e pessoas é facilitada quando o 
arquivo é do tipo texto, a menos que você conheça o formato proprietário usado.
Introdução Geral a Arquivos
Operações de Leitura e Escrita são muito custosas em termos de tempo. Assim, 
não tem sentido escrever um caractere por vez no dispositivo de saída. 
Normalmente, os dados (caracteres) são transferidos para o buffer e quando esse 
estiver cheio ou uma instrução de transferência for executada, todos os dados dessa 
área são escritos no respectivo arquivo. 
Classes de Funções para Manipulação de Arquivos na 
Linguagem C:
¾ Abertura e Fechamento;
¾ Leitura/Escrita Formatadas (ASCII);
¾ Leitura/Escrita Binários;
¾ Manipulação de Diretórios/Arquivos (Gerais).
¾ Posicionamento (acesso randômico), verificação de 
estado e outras (Gerais);
Abertura e Fechamento: fopen(), fclose().
Leitura/Escrita Formatadas de propósito geral (ASCII): 
fscanf(), fprintf().
Leitura/Escrita Binária de blocos de dados: fread(), fwrite().
Posicionamento (acesso randômico), verificação de estado e outras: 
delete(), exist(), ferror(), feof(), fseek(), ftell(), 
frewind().
Classes de Funções para Manipulação de Arquivos na 
Linguagem C:
Leitura/Escrita de caracteres : fgetc(), fputc().
Leitura/Escrita de strings : fgets(), fputs().
Variável Ponteiro de Arquivo
...
Ponteiro de Arquivo
Todo arquivo possui uma variável ponteiro que está indefinida ou aponta 
para uma dada posição no arquivo. Quando fazemos uma operação de 
leitura (um único elemento) o dado que é lido é exatamente aquele que está
sendo apontado por esta variável. Após a leitura, automaticamente esta 
variável passa a apontar para o próximo elemento.
Imagem abstrata de um arquivo com um conjunto de elementos/itens/registros.
O QUE VOCÊ AINDA NÃO SABE SOBRE ARQUIVOS EM C
Todas as vezes que um programa em C é executado, 
automaticamente cinco arquivos são associados a ele.
¾ stdin (entrada padrão) que está associado ao teclado.
¾ stdout (saída padrão) que está associado ao monitor.
¾ stderr (saída de erros) que está associado ao monitor.
Além destes, podemos usar ainda os seguintes arquivos, se necessários.
¾ stdaux que está associado a porta serial.
¾ stdprn que está associado a porta paralela (impressora).
Abrindo Arquivos:
fopen(.) Forma Geral:
FILE *fopen(const char *nome_arq, const char *permissão)
Onde: Æ
‘nome_arq’ nome do arquivo (cadeia de caracteres) que se deseja abrir 
para leitura, escrita ou anexação de dados. Um path (caminho) pode ser 
especificado. 
FILE é uma estrutura (struct) com uma série de informações associadas 
ao arquivo. Iremos descrevê-la posteriormente.
‘permissão’ é uma string que define o modo de abertura do arquivo. A 
tabela a seguir ilustra as diferentes formas de abertura de um arquivo.
Anexação (append) de dados ao final do arquivo. Se o arquivo existir ele 
é aberto, senão, um novo é criado se necessário (somente escrita).
“a”
Leitura e Escrita num arquivo existente.“r+”
Leitura e Escrita num arquivo . Se ele existir, seu conteúdo será apagado 
e um novo é criado.
“w+”
Abre um arquivo existente (cria se necessário) para leitura e escrita de 
dados ao final do arquivo (anexa/concatena).
“a+”
Somente Escrita. Se o arquivo existir ele é apagado e um novo será
criado em seu lugar.
“w”
..............
Somente Leitura (o arquivo deve existir senão ocorre um erro)“r”
Abrindo Arquivos: Modos de Abertura (permissão)
Abrindo Arquivos: Modos de Abertura (permissão)
Em geral, por default um arquivo é aberto em modo texto. Entretanto, 
há uma variável global f_mode (Turbo C, Visual C, DevC++) que 
determina em qual modo (texto, binário) um arquivo será aberto.
O valor default da variável f_mode é O_TEXT (modo texto). Se você 
desejar alterar a abertura de arquivos para o modo default binário, 
então f_mode deve ser inicializada com o valor O_BINARY.
As constantes O_TEXT (modo texto) e O_BINARY (modo binário) 
estão no arquivo de cabeçalho <fcntl.h.> (não é padrão)
Leitura e escrita num arquivo existente (modo texto).“rt+”
Leitura em modo binário (o arquivo deve existir senão ocorre um erro).“rb”
Anexação (append) de dados no final do arquivo. Se o arquivo existir ele é
aberto, senão, um novo é criado se necessário (somente escrita).
“at”
Escrita em modo binário (cria se necessário). Se o arquivo existir ele é
apagado e um novo é criado .
“wb”
Se existir alguma dúvida em relação ao modo default em algumas 
plataformas, é possível diferenciar entre modo binário (b) e modo texto (t), 
simplesmente acrescentando a letra ‘t’ ou a letra ‘b’ na string de permissão. 
Modos de Abertura (permissão)
...
Antes do arquivo ser aberto a variável ponteiro não existe para este 
arquivo. 
Assim, quando uma operação de leitura/escrita é realizada o sistema 
sabe exatamente onde começar e terminar.
Variável Ponteiro de Arquivo antes e depois de fopen():
Após a execução da função fopen(.) a variável ponteiro aponta para o 
primeiro byte do primeiro elemento do arquivo (byte 0).
Exemplos de uso da função fopen():
fp1 = fopen(“dados1.dat”,”rb”)
Abre o arquivo binário dados1.dat apenas para leitura. 
fp2 = fopen(“dados2.dat”,”wt”)
Abre o arquivo dados2.dat no modo texto para escrita de dados.
...
FILE *fp1, *fp2;
...
Exemplos de uso da função fopen():
fp2 = fopen(“dados11.dat”,”rb+”)
Abre o arquivo binário dados11.dat para leitura e escrita no modo binário. 
Pressupõe que o arquivo exista, senão, retorna a constante simbólica NULL. 
fp1 = fopen(“dados21.dat”,”wb+”)
Abre o arquivo binário dados21.dat para leitura e escrita no modo binário. Se o 
arquivo existir, todos os dados existentes serão destruídos.
fp1 = fopen(“dados2.dat”,”at”)
Abre o arquivo de texto dados2.dat no modo texto para que novos dados sejam 
anexados aos dados já existentes.
Como já foi comentado, a função fopen(.) pressupõe um valor de retorno, 
logo é importante verificar se este valor está correto, ou seja, se o valor de 
retorno é positivo (aponta para alguma posição diferentes de NULL (0)). 
Assim, sempre que usar esta função em seus códigos, escreva algo do tipo:
...
fp1 = fopen(“dados1.dat”,”permissão”);
if (fp1 != NULL)
% operações sobre o arquivo
else printf(“\n\n Não foi possível abrir o arquivo!!!”);
...
ERROS MAIS COMUNS: Disco cheio, Unidade/Nome de arquivo inválido, número de 
arquivos abertos já esgotados, ...
Boas Práticas de Programação:
Fechando Arquivos:
fclose(.) Forma Geral:
int fclose(FILE *fp1)
Onde: Æ fp1 é o nome da variávellógica (programa) que aponta para o 
arquivo (físico) que foi aberto pela função fopen().
O valor de retorno da função é 0 (zero) em caso de sucesso e, EOF (End Of
File)(-1), em caso de erro. Por exemplo, se você tentar fechar um arquivo 
inexistente.
É importante fechar todos os arquivos antes do término de seu programa. Se 
você está manipulando um arquivo no modo texto, o uso de fclose(.) 
garante que todos os dados ainda no buffer serão transferidos (escritos) 
imediatamente para o arquivo.
Além disso, elimina a ligação criada entre o arquivo físico e a variável interna 
usada para manipulá-lo.
Como a função fclose(.) também possui um valor de retorno, é igualmente 
importante verificar se este valor está correto, ou seja, se o valor de retorno é
zero. Assim, sempre que usar esta função em seus códigos, escreva algo do 
tipo:
...
status = fclose(fp1);
if ( !status )
printf(“\n\n Arquivo fechado com sucesso!!!”);
else printf(“ \n\n Não foi possível fechar o arquivo!!!”);
end
...
Boas Práticas de Programação:
É claro que as duas primeiras instruções do código acima 
poderiam ser combinadas em uma única instrução.
int fgetc(FILE *fp1);
Esta função lê um caractere na posição atual do arquivo associado a variável fp1 e 
devolve esse caractere. Após a leitura, o “ponteiro de posição” avança para a 
posição do próximo caractere no arquivo.
Função de Leitura de Caracteres em Arquivos:
fgetc(.) Forma Geral:
...
while ( ch = fgetc(fp1) != EOF) {
// podemos fazer a leitura e demais operações
...
}
Se o final do arquivo foi alcançado, a função fgetc(.) retorna uma valor especial 
que é EOF (end of file), indicando que não é mais possível continuar a leitura. O 
teste com EOF deve ser usado somente com arquivos do tipo texto.
Para evitar problemas ao tentar ler caracteres após o final do arquivo, uma 
alternativa é usar o código abaixo.
int fputc(int ch, FILE *fp1);
Esta função escreve o caractere ch no arquivo associado a variável fp1 na posição 
corrente do “ponteiro de posição” do arquivo especificado no segundo parâmetro.
Função de Escrita de Caracteres em Arquivos:
fputc(.) Forma Geral:
O valor de retorno é o próprio caractere (valor ordinal) escrito. Se houver um erro, 
então, a constante pré-definida EOF é devolvida.
Programas em anexo a esta aula:
Exemplo 01:Æ Contando o numero de linhas de um arquivo;
Exemplo 02:Æ Conta o número de ocorrências de cada uma das letras do 
alfabeto;
Exemplo 03:Æ Conta o número de caracteres de um arquivo, incluindo os 
caracteres de mudança de linha. Não conta o caractere de terminação do 
arquivo.
Exemplo 04:Æ Cria uma copia de um arquivo em outro, ou seja, duplica um 
arquivo usando strings e não caractere a caractere.
Exemplo 05:Æ Conta o numero de vogais minúsculas num arquivo.
Exemplo 06:Æ Cria uma copia de um arquivo com os caracteres alfabéticos 
escritos em maiúsculas.

Outros materiais