Upload
filipe-xavier-minormonif
View
703
Download
0
Embed Size (px)
DESCRIPTION
Arquivo em C
Citation preview
Mtodos Computacionais
Arquivos
2Arquivos Um arquivo representa um elemento de informao armazenado em memria secundria (disco)
Caractersticas:Informaes so persistidasAtribui-se nomes aos elementos de informao (arquivos e diretrios),em vez de endereos de memriaAcesso s informaes so mais lentos
3Persistncia... pra qu?
No perder os dados no fim da execuo de um programa
Memria temporria(volatil)principalMais rpida e cara
Memria permanentesecundriamais lenta e barata
Para melhorar velocidade de acesso, a cada acesso, transfere-se trechos maiores do arquivo para espaos da memria (buffers)
3
4Modos de Acesso a Arquivos em C
Dois modos de acesso:Texto e Binrio
4
Arquivo Texto:0 1 2 3 4
Arquivo Binario:0 1 2 3 4
Informao persistidaString
Inteiros
5Modo Texto interpretado como uma seqncia de caracteres agrupadas em linhasLinhas so separadas por um caractere de nova linha
Vantagens:Pode ser lido facilmente por uma pessoaEditado por editores de texto convencionais
DesvantagensCodificao dos caracteres pode variar (ASCII, UTF-8, ISSO-8859, etc)Arquivos tendem a ser maiores (todas os dados so convertidos para caracteres)
5
6Modo Binrio
Dados so armazenados da mesma forma que so armazenados na memria principal
Vantagens:Facilmente interpretados por programasMaior velocidade de manipulaoArquivos so, geralmente, mais compactos
Desvantagens:Difcil de serem entendidos por pessoasDependentes da mquina onde foram gerados
6
7Operaes em Arquivos
AberturaSistema Operacional (SO) encontra arquivo pelo nomePrepara buffer na memria
LeituraSO recupera trecho solicitado do arquivoParte ou todo trecho pode vir do buffer
7
8Operaes em Arquivos
EscritaSO altera contedo do arquivoAlterao feita primeiro no buffer para depois ser transferida para o disco
FechamentoInformao do buffer atualizada no discorea do buffer utilizada na memria liberada
8
99
Abertura de Arquivos em C
Operaes de manipulao de arquivos em C se encontram, geralmente, na stdio.hFuno de Abertura
NomeNome do arquivo
FILETipo que representa uma abstrao do arquivo
modor - Indica leituraw Indica escrita a Indica escrita ao final do existentet Indica modo textob Indica modo binrio
FILE* fopen(char* nome,char* modo);
10
Abertura de Arquivos em C
10
SO mantm um cursor que indica a posio de trabalho no arquivoSe modo w e arquivo j existe
Arquivo destrudo e um novo vazio criado
Se modo w ou a e arquivo no existeUm novo arquivo criado
No modo r, o arquivo j deve existirModos t e b podem ser combinados com os demais modosSe no for possvel a abertura, a funo retorna NULL
11
Exemplos de Abertura de Arquivos
FILE *fp;fp = fopen(teste.txt, rt);
fp = fopen(teste.bin, wb);
fp = fopen(teste.txt, r+);
fp = fopen(teste.txt, w+);
Modo leitura e texto
Modo escrita e binrio
Modo leitura e escritaem arquivo existente
Modo escrita e leituraem arquivo novo
Modos t e b podem seromitidos
11
12
Fechamento de Arquivos
Aps leitura/escrita do arquivo, devemos fech-loFuno de fechamento
Retorna 0 se o arquivo foi fechado com sucessoRetorna constante EOF se houve algum erro
int fclose(FILE* fp);
12
13
Leitura (Modo Texto)
A cada operao de leitura, os dados correspondentes so transferidos para a memria e o cursor avana e aponta para o prximo dadoExiste em C a funo fscanf para ler dados de um arquivo modo texto
Similar a scanfL de um arquivo passado como parmetro em vez de somente da entrada padro (teclado)Pode ler tambm da entrada padro (arquivo stdin)
13
14
Leitura com fscanf
Retorna nmero de dados lidos com sucessofp o ponteiro para o arquivoformato equivale aos cdigos de formatao (iguais aodo scanf)end_variaveis corresponde a lista de endereos de variveis que armazenaro os dados lidos do arquivo
int fscanf(FILE* fp, char* formato,end_variaveis)
14
15
Usando fscanf para Leitura (Modo Texto)
15
#include int main() {
FILE *fp; char primeiraPalavra[121];fp = fopen(teste.txt,r);if (fp == NULL) {
printf(Impossvel abrir arquivo);exit(1);
}fscanf(fp, %120s,primeiraPalavra);printf(A primeira palavra do arquivo teste.txt
: %s\n,primeiraPalavra);fclose(fp);
return 0;}
L uma string do arquivo apontado porfp de at 120 caracteres e armazena
em primeiraPalavra
1616
Outras Funes de Leitura (Modo Texto)
L um caractere de um arquivoRetorna o cdigo do caractere lidoRetorna EOF se fim do arquivo for alcanado
s a cadeia de caracteres que armazenar o que for lidon o nmero mximo de caracteres a serem lidosL uma seqencia de caracteres at que \n seja encontrado ou que n caracteres tenham sido lidosRetorna ponteiro para a cadeia s
int fgetc(FILE* fp);
char* fgets(char* s, int n, FILE* fp);
1717
Usando fgetc para a Leitura
#include int main() {FILE *fp; char c;int nCaracteres = 0, nLinhas = 0;fp = fopen(teste.txt,r);if (fp == NULL) {
printf(Impossvel abrir arquivo);exit(1);
}while ((c = fgetc(fp)) != EOF) {
if (c == \n) nLinhas++;else nCaracteres++;
}printf(Caracteres:%d,Linhas:%d\n,nCaracteres,nLinhas);fclose(fp); return 0;}
Programa conta nmero de caracteres e conta o nmero de
linhas de um arquivo
1818
int main() {FILE *fp;int nOcorrencias = 0; char palavra[121], linha [121];printf (Digite a palavra:\n);scanf( %120[^\n],palavra);fp = fopen(teste.txt,r);if (fp == NULL) {
printf(Impossvel abrir arquivo);exit(1);
}while (fgets(linha,121,fp) != NULL) {
if (strstr(linha,palavra) != NULL) nOcorrencias++;
}fclose(fp);printf(Ocorrncias de %s = %d\n, palavra,nOcorrencias);return 0;}
Programa conta ocorrncias de uma palavra em um arquivo com linhas de no maximo 120 caracteres
Usando fgets para a Leitura
L uma linha e armazena em linha
Utiliza funo strstr de string.h para saber se palavra substring de linha
19
Escrita (Modo Texto)
A cada operao de escrita, os dados so gravados na memria e posteriormente no disco, e o cursor avana apontando para a proxima posio do arquivo:Existe em C a funo fprintf para escrever dados em um arquivo modo texto
Similar a printfEscreve em um arquivo passado como parmetro em vez de somente na sada padro (monitor)Pode escrever tambm na sada padro (arquivo stdout)
19
20
Leitura com fprintf
Retorna nmero de dados escritos com sucessofp o ponteiro para o arquivoformato equivale aos cdigos de formatao (iguais aodo printf)variaveis corresponde a lista de variveis, cujoscontedos sero escritos no arquivo
int fprintf(FILE* fp, char* formato,variaveis)
20
2121
#include int main() {
FILE *fp; char palavra[121];fp = fopen(teste.txt,w);if (fp == NULL) {
printf(Impossvel abrir arquivo);exit(1);
}printf (Digite a palavra:\n);scanf( %120[^\n],palavra);fprintf(fp,%s\n,palavra); fclose(fp);return 0;}
Usando fprintf para Escrita (Modo Texto)
Programa escreve uma palavra de no mximo 120 caracteres em um
arquivo
2222
Outras Funes de Escrita (Modo Texto)
Escreve um caractere de um arquivoRetorna o cdigo do caractere escritoRetorna EOF se fim do arquivo for alcanado
s a cadeia de caracteres que ser escritaRetorna ponteiro para a cadeia s
int fputc(FILE* fp, char c);
char* fputs(char* s,FILE* fp);
2323
int main() {FILE *e; FILE *s;int caractere; char nome_entrada[121];printf (Digite o nome do arquivo de entrada:\n);scanf(%120s, nome_entrada);e = fopen(nome_entrada,r);if (e== NULL) {
printf(Impossvel abrir arquivo de entrada);exit(1);}s = fopen(strcat(nome_entrada,_maiuscula),w);if (s== NULL) {
printf(Impossvel abrir arquivo de saida);exit(1);}while ((caractere = fgetc(e)) != EOF)
fputc(toupper(caractere),s);fputs(\nArquivo Convertido!,s);fclose(e); fclose(s);return 0;}
Programa l um arquivo e gera outro com todas as letras convertidas para maiusculas
Usando fputs e fputc para Escrita
Usurio fornece o nomedo arquivo
Converte caractere a caractere e escreve no
arquivo
24
Leitura (Modo Binrio)
p o endereo de memria em que vai ser armazenado o que for lidotam o tamanho em bytes de cada elemento lidonelem o nmero de elementos de tamanho tam lidos Retorna a quantidade de bytes lidos com sucesso (tam * nelem)
int fread(void* p,int tam,int nelem,FILE* fp);
24
25
Escrita (Modo Binrio)
p o endereo de memria cujo contedo deseja-se salvar em arquivotam o tamanho em bytes de cada elemento escritonelem o nmero de elementos de tamanho tam escritos Retorna a quantidade de bytes escritos com sucesso (tam * nelem)
int fwrite(void* p,int tam,int nelem,FILE* fp);
25
2626
Usando fwrite na Escrita#include typedef struct ponto {
float x,y;} Ponto;
void salva (char* arquivo, int n, Ponto* vet) {FILE* fp = fopen(arquivo, wb);if (fp == NULL) {
printf(Erro na abertura do arquivo.\n);exit(1);
}fwrite(vet, sizeof(Ponto), n, fp);fclose(fp);
} Funo que salva um vetor de pontos em um arquivo binrio
Nmero de pontos do vetor
27
Usando fread na Leitura
void carrega (char* arquivo, int n, Ponto* vet) {FILE* fp = fopen (arquivo, rb);if (fp == NULL) {
printf(Erro na abetura do arquivo.\n);exit(1);
}fread (vet, sizeof(Ponto), n, fp);fclose(fp);
}
Funo que recupera um vetor de pontos de um arquivo binrio
27
2828
Usando as Funes Definidas Anteriormente
int main() {Ponto *entrada, *saida; int nPontos, cont,pos ;FILE *arquivo;char nome_arquivo[121];printf(Digite o nome do arquivo:\n);scanf(%120s,nome_arquivo);printf(\nDigite o nmero de pontos:\n);scanf(%d,&nPontos);entrada = (Ponto *) malloc(nPontos*sizeof(Ponto));for (cont = 0; cont < nPontos;cont++) {
printf(Digite coordenadas x,y:\n);scanf(%f%f,&entrada[cont].x,&entrada[cont].y);
}/* continua */ Programa que salva e recupera um vetor de
pontos em um arquivo binrio
2929
salva(nome_arquivo, nPontos, entrada);do {
printf(Digite agora a posio do ponto que deseja ver: \n);
scanf(%d,&pos);} while (pos > nPontos || pos
30
Funes Utilitrias
Retorna a posio atual do cursor do arquivoCorresponde a distancia em bytes em relao ao comeo do arquivo
long ftell(FILE* fp);
Devem ser utilizadas com cautela em arquivos no modo texto, pois nem sempre o posicionamento do cursor vai ser o desejado
Certas plataformas podem colocar caracteres de formatao no visveis que podem alterar o tamanho do arquivo (nmero de bytes)
30
31
Funes Utilitrias
Utilizada para posicionamento do cursor em um arquivodist o nmero de bytes em relao a origemorigem uma posio do cursor do arquivo em bytes (SEEK_CUR posio corrente; SEEK_SET incio do arquivo; SEEK_END final do arquivo)Retorna a nova posio do cursor
long fseek(FILE* fp,long dist,int origem);
31
3232
Funes Utilitrias
Ponto le_ponto (FILE* fp, int i) {Ponto p;fseek (fp, i*sizeof(Ponto), SEEK_SET);fread(&p, sizeof(Ponto), 1, fp);return p;
}
int tamanho_arquivo (FILE *fp) { int tamanho; fseek (fp, 0, SEEK_END);tamanho =ftell (fp); return tamanho;
}
Funo que recupera o i-simo ponto armazenado em um arquivo
Funo que retorna o tamanho do arquivo em bytes
Mtodos ComputacionaisArquivosPersistncia... pra qu?Modos de Acesso a Arquivos em CModo TextoModo BinrioOperaes em ArquivosOperaes em ArquivosAbertura de Arquivos em CAbertura de Arquivos em CExemplos de Abertura de ArquivosFechamento de ArquivosLeitura (Modo Texto)Leitura com fscanfUsando fscanf para Leitura (Modo Texto)Outras Funes de Leitura (Modo Texto)Usando fgetc para a LeituraEscrita (Modo Texto)Leitura com fprintfOutras Funes de Escrita (Modo Texto)Leitura (Modo Binrio)Escrita (Modo Binrio)Usando fwrite na EscritaUsando as Funes Definidas AnteriormenteFunes UtilitriasFunes UtilitriasFunes Utilitrias