Académique Documents
Professionnel Documents
Culture Documents
Manipulao de Arquivos
Estrutura de Dados II Prof. Guilherme Tavares de Assis
Sistemas operacionais, como Linux ou Windows, permitem que arquivos sejam criados e recuperados por um nome e pela posio em uma hierarquia de diretrios. Devem ser utilizados em programas quando:
Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM
1
no existe espao em memria principal para o armazenamento de um grande volume de dados; h necessidade do armazenamento de dados por um perodo de tempo indeterminado.
Para utilizar um arquivo, preciso associ-lo a uma varivel lgica (stream) e, ento, manipul-la.
A associao ocorre na operao de abertura do arquivo.
Abrir ou criar o arquivo, associando o nome fsico do arquivo ao seu nome lgico. Manipular os dados do arquivo: consulta, incluso, excluso, alterao. Fechar o arquivo.
Ponteiro de Arquivo
O ponteiro de arquivo serve para referenciar o arquivo a ser tratado pelo programa.
O ponteiro no aponta diretamente para o arquivo; contm as seguintes informaes sobre o mesmo: nome, situao (aberto ou fechado) e posio atual sobre o arquivo.
Abrir o arquivo, caso exista, associando o nome fsico do arquivo ao seu nome lgico; seno ir para o passo 4. Ler os dados do arquivo, armazenando-os em memria principal. Fechar o arquivo. Manipular os dados em memria principal: consulta, incluso, excluso, alterao. Criar o arquivo, associando o nome fsico do arquivo ao seu nome lgico. Gravar os dados da memria principal para o arquivo. Fechar o arquivo.
5
Para se definir uma varivel ponteiro de arquivo, usa-se a seguinte declarao: FILE *Arquivo; Desta forma, passa a existir uma varivel de nome Arquivo que ser o ponteiro de um arquivo a ser criado ou aberto.
6
Abertura de Arquivo
Ponteiro de arquivo (nome lgico do arquivo) Nome fsico do arquivo Modo de abertura
arquivo = fopen ("nomefisico.txt", "r"); A funo fopen() abre um arquivo. Para tanto, devem ser passados o nome fsico do arquivo e o modo de abertura. Caso o arquivo possa ser aberto, retorna um ponteiro referente; caso contrrio, retorna NULL (nulo).
Abertura de Arquivo
Modo r w a r+ w+ a+ rb wb ab r+b w+b a+b Ao Abre um arquivo texto existente para leitura Cria um arquivo texto para escrita Abre um arquivo texto para insero no final Abre um arquivo texto existente para leitura e escrita Cria um arquivo texto para leitura e escrita Abre um arquivo texto para leitura e insero no final Abre um arquivo binrio existente para leitura Cria um arquivo binrio para escrita Abre um arquivo binrio para insero no final Abre um arquivo binrio existente para leitura e escrita Cria um arquivo binrio para leitura e escrita Abre um arquivo binrio para leitura e insero no final
9
Abertura de Arquivo
// Verificao de abertura de arquivo if ((arquivo = fopen("teste.txt","r")) == NULL) { puts ("Arquivo nao pode ser aberto..."); exit (1); }
10
Fechamento de Arquivo
Ponteiro de arquivo (nome lgico do arquivo)
fclose (arquivo); O comando fclose() fecha um arquivo em nvel de sistema operacional. Para tanto, deve ser passado o nome lgico do arquivo a ser fechado. Terminar um programa, sem fechar um arquivo aberto, pode provocar perda de dados no arquivo ou corromp-lo. Como, normalmente, h limite do sistema operacional para o nmero de arquivos abertos ao mesmo tempo, pode ser necessrio fechar um arquivo antes de abrir outro.
11
caractere = getc (arquivo); A funo getc() ou fgetc() l um caractere de um arquivo texto, retornando-o. Para tanto, deve ser passado o nome lgico do arquivo aberto.
Se o ponteiro do arquivo estiver no final do mesmo ou ocorrer um erro na leitura, a funo retorna EOF.
Existem duas funes para preservar a compatibilidade com verses mais antigas de C/C++.
12
fgets (cadeia, tamanho, arquivo); A funo fgets() l uma cadeia de um arquivo texto. Para tanto, devem ser passados a cadeia a ser lida (dado de sada), o tamanho mximo da cadeia e o nome lgico do arquivo aberto.
A funo l a cadeia at que um caractere de nova linha seja alcanado ou (tamanho - 1) caracteres tenham sido lidos. A funo inclui os caracteres "\n" e NULL ao final da cadeia. Se a leitura ocorrer devidamente, a funo retorna um ponteiro para a cadeia lida; caso contrrio, retorna nulo.
14
fscanf (arquivo, "formatao", variveis); A funo fscanf() l dados formatados de um arquivo texto. Para tanto, devem ser passados o nome lgico do arquivo aberto, os cdigos de formatao referentes aos dados a serem lidos e as variveis que recebero os dados lidos.
Se a leitura ocorrer devidamente, a funo retorna a quantidade de dados lidos com sucesso; caso contrrio, retorna 0. Se a funo tenta ler o fim de arquivo, retorna EOF.
16
putc (caractere, arquivo); A funo putc() ou fputc() escreve um caractere em um arquivo texto. Para tanto, devem ser passados o caractere a ser escrito e o nome lgico do arquivo aberto.
Se a escrita ocorrer devidamente, a funo retorna o caractere escrito; caso contrrio, retorna EOF.
Existem duas funes para preservar a compatibilidade com verses mais antigas de C/C++.
18
fputs (cadeia, arquivo); A funo fputs() escreve uma cadeia em um arquivo texto. Para tanto, devem ser passados a cadeia a ser escrita e o nome lgico do arquivo aberto.
Se a escrita ocorrer devidamente, a funo retorna um valor no negativo; caso contrrio, retorna EOF.
20
fprintf (arquivo, "formatao", variveis); A funo fprintf() escreve dados formatados em um arquivo texto. Para tanto, devem ser passados o nome lgico do arquivo aberto, os cdigos de formatao e as variveis referentes aos dados a serem escritos no arquivo.
Se a escrita ocorrer devidamente, a funo retorna a quantidade de bytes escritos com sucesso no arquivo; caso contrrio, retorna 0.
22
Final de Arquivo
Ponteiro de arquivo (nome lgico do arquivo)
feof (arquivo); A funo lgica feof() serve para indicar que o final de um arquivo binrio (preferencialmente) ou texto foi encontrado. Para tanto, deve ser passado o nome lgico do arquivo aberto.
Se o fim de arquivo no tiver sido atingido, a funo retorna 0; caso contrrio, retorna um valor diferente de 0. geralmente usada em leitura de arquivos binrios, pois um valor inteiro pode ser lido, erroneamente, como sendo o EOF e no como parte do arquivo, finalizando a leitura.
24
Final de Arquivo
#include <iostream> #include <stdio.h> using namespace std; int main ( ) { FILE *arq; char ch; int cont = 0; if ((arq = fopen("teste.txt","r")) == NULL) { cout << "Erro na abertura do arquivo\n"; return 0; } while (!feof(arq)) { ch = getc(arq); cont++; } fclose (arq); cout << "Quantidade: " << cont << endl; return 0; }
25
fread (varivel, tamanho, quantidade, arquivo); A funo fread() l itens de um arquivo binrio. Para tanto, devem ser passados a varivel que receber os itens lidos, o tamanho em bytes do item a ser lido, a quantidade de itens a serem lidos (cada item do tamanho especificado) e o nome lgico do arquivo aberto.
Se a leitura ocorrer devidamente, a funo retorna o nmero de itens lidos que, normalmente, igual ao terceiro argumento.
Se for encontrado o fim de arquivo, o nmero retornado menor.
26
fwrite (varivel, tamanho, quantidade, arquivo); A funo fwrite() escreve itens em um arquivo binrio. Para tanto, devem ser passados a varivel que contm os itens a serem escritos, o tamanho em bytes do item a ser escrito, a quantidade de itens a serem escritos (cada item do tamanho especificado) e o nome lgico do arquivo aberto.
Se a escrita ocorrer devidamente, a funo retorna o nmero de itens escritos, ou seja, o tamanho especificado.
Se ocorrer um erro, o nmero retornado diferente do tamanho.
28
fseek (arquivo, deslocamento, origem); A funo fseek() altera o endereo do ponteiro de um arquivo binrio. Para tanto, devem ser passados o nome lgico do arquivo aberto, o deslocamento do ponteiro em termos de bytes e o ponto de origem do deslocamento.
Se a movimentao ocorrer devidamente, a funo retorna o valor 0; caso contrrio, retorna um valor diferente de 0.
30
rewind (arquivo); O comando rewind() faz com que o ponteiro de um arquivo aponte para o incio do mesmo. Para tanto, deve ser passado o nome lgico do arquivo aberto.
31
32
long fone;
int main ( ) { Registro cliente; FILE *arq; char auxiliar[9]; if ((arq = fopen("clientes.bin","w+b")) == NULL) { cout << "Erro na abertura do arquivo\n"; return 0; } // continua ...
posicao = ftell (arquivo); A funo ftell() retorna a posio corrente do ponteiro de um arquivo binrio, ou seja, o nmero de bytes desde o incio do arquivo. Para tanto, deve ser passado o nome lgico do arquivo aberto.
Verificao de Erro
Ponteiro de arquivo (nome lgico do arquivo)
Limpeza de Buffer
Ponteiro de arquivo (nome lgico do arquivo)
fflush (arquivo); ferror (arquivo); A funo ferror() retorna verdadeiro se ocorreu um erro durante a ltima operao com o arquivo; caso contrrio, retorna falso. Para tanto, deve ser passado o nome lgico do arquivo aberto.
Como cada "operao de arquivo" modifica a condio de erro, a funo deve ser chamada logo aps a operao a ser avaliada.
37
A funo fflush() escreve o contedo do buffer em um arquivo, esvaziando-o. Para tanto, deve ser passado o nome lgico do arquivo aberto para escrita.
Se a limpeza do buffer ocorrer devidamente, a funo retorna o valor 0; caso contrrio, retorna EOF.
Pode ser usada para limpar buffer da entrada padro fflush (stdin) - ou liberar buffer de escrita para a sada padro - fflush (stdout) .
38
Remoo de Arquivo
Nome fsico do arquivo
Remoo de Arquivo
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; main (int argc, char *argv[]) { char opcao; if (argc != 2) { printf ("Formato: executvel arquivo\n"); exit(1); } printf("Deseja apagar o arquivo %s (S/N)?", argv[1]); fflush (stdout); // liberao do buffer, quando preciso opcao = getchar(); if (toupper(opcao) == 'S') if (remove(argv[1])) { printf ("Erro ao tentar apagar arquivo.\n"); exit(1); } else printf ("Arquivo apagado com sucesso.\n"); }
39 40
remove (nome_arquivo); A funo remove() remove um arquivo. Para tanto, deve ser passado o nome fsico do arquivo fechado.
Se a remoo do arquivo ocorrer devidamente, a funo retorna o valor 0; caso contrrio, retorna um valor diferente de zero.
Renomeao de Arquivo
Nome fsico do arquivo a ser renomeado Novo nome fsico do arquivo
Renomeao de Arquivo
#include <stdio.h> #include <stdlib.h> using namespace std; main ( ) { char atual[30], novo[30]; printf ("Nome atual do arquivo original: "); fflush (stdout); // liberao do buffer, quando preciso gets (atual); printf ("Novo nome para o arquivo: "); fflush (stdout); // liberao do buffer, quando preciso gets (novo); if (rename(atual, novo)) { printf("Erro ao renomear arquivo!\n"); exit (1); } else printf ("Arquivo renomeado com sucesso.\n"); }
41 42
rename (nome_atual, nome_novo); A funo rename() renomeia um arquivo. Para tanto, devem ser passados o nome fsico atual do arquivo fechado e o novo nome fsico do mesmo.
Se a renomeao do arquivo ocorrer devidamente, a funo retorna o valor 0; caso contrrio, retorna um valor diferente de zero.