Buscar

Computação Básica - Manipulação de Arquivos II

Prévia do material em texto

Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
COMPUTAÇÃO BÁSICA
Manipulação de Arquivos
Prof. Bruno Macchiavello (bruno@cic.unb.br)
Universidade de Brasília – UnB 
Instituto de Ciências Exatas – IE 
Departamento de Ciência da Computação – CIC 
Prof. Bruno Macchiavello 1
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Arquivos Binarios
• ARQUIVOS BINÁRIOS: São arquivos versáteis,
pois possuem maior facilidade de leitura e
escrita, pois podemos gravar estruturas inteiras
de uma vez, como vetores por exemplo, e
acessá-los facilmente, ao contrário dos arquivosacessá-los facilmente, ao contrário dos arquivos
TEXTO que temos que escrever (e ler) dado por
dado.
• Em arquivos binários normalmente são usadas
as funções fwrite() para escrever e fread() para
ler.
Prof. Bruno Macchiavello 2
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Arquivos Binarios
• ARQUIVOS BINÁRIOS
fwrite(&nome_da_variavel, sizeof(tipo_variavel), qtde a ser 
gravada, FILE *fp) 
/*a função sizeof retorna o tamanho em bytes do tipo da /*a função sizeof retorna o tamanho em bytes do tipo da 
variavel*/
fread (&nome_da_variavel, sizeof(tipo_variavel), qtde a ser lida, 
FILE *fp) 
• A variável, no caso da função fwrite é a variável onde o dado 
a ser gravado se encontra e que será passado para o 
arquivo. No caso da função fread é a variável que irá receber 
o valor que será lido do arquivo.
Prof. Bruno Macchiavello 3
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo: um programa que escreve a string “Meu primeiro programa com arquivo binário” em
um arquivo, em seguida lê a mesma (do arquivo) e mostra seu conteúdo na tela:
#include <stdio.h>
#include <string.h>
int main (){
FILE *fp;
char string[50];
char nomeArquivo[50];
strcpy(nomeArquivo, "arquivoBinario.bin");
if (fopen(nomeArquivo, "a+b") == NULL) {
fp = fopen(nomeArquivo, "wb");
} else { 
Prof. Bruno Macchiavello 4
} else { 
fp = fopen(nomeArquivo, "a+b");
}
strcpy(string,"Meu primeiro programa com arquivo binario");
fwrite(string, sizeof(string),1,fp);
fclose(fp); 
fp = fopen(nomeArquivo,"a+b");
strcpy(string," ");
fread(string, sizeof(string),1,fp);
printf("\nVeja o conteudo da string lida do arquivo: ");
printf("\n%s ", string); getchar();
fclose(fp);
return 0;
}
Note que foi possível escrever
toda a string sem o WHILE. 
Isso foi possivel pois foi
guardada no arquivo
a estrutura binária da string.
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo: um programa que escreve uma STRUCT em um arquivo, e depois lê esta
informação do arquivo e mostra na tela. Neste exemplo são lidas e gravadas informações
(código e nome) para 3 pessoas.
#include <stdio.h>
typedef struct {
int codigo;
char nome[30];
} tipoDadosPessoa;
int main() {
FILE *fp;
Prof. Bruno Macchiavello 5
FILE *fp;
tipoDadosPessoa dadosDePessoa;
int i;
char nomeArquivo[50];
strcpy(nomeArquivo, "arqbin.bin");
if (fopen(nomeArquivo, "a+b") == NULL) {
fp = fopen(nomeArquivo, "wb");
} else { 
fp = fopen(nomeArquivo, "a+b");
}
/* CONTINUA NO PRÓXIMO SLIDE */
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
/* CONTINUAÇÃO DO SLIDE ANTERIOR */
for (i = 0; i<3; i++ ) {
printf("Informe o nome: ");
scanf("%s", dadosDePessoa.nome);
printf("Informe o cod: ");
scanf("%d", &dadosDePessoa.codigo);
fwrite(&dadosDePessoa,sizeof(tipoDadosPessoa),1,fp);
}
Lê um registro e grava no arquivo.
Prof. Bruno Macchiavello 6
}
fclose(fp);
fopen(nomeArquivo,"a+b");
while (fread(&dadosDePessoa, sizeof(tipoDadosPessoa),1,fp) != 0)
{
printf("\n\nNome: %s",dadosDePessoa.nome);
printf("\nCod: %d",dadosDePessoa.codigo);
getchar(); 
}
fclose(fp);
}
Lê um registro de cada vez 
do arquivo.
O loop encerra quando a função
fread retornar 0 (zero) caracteres
lidos, ou seja, quando chegar
no fim do arquivo.
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo: um programa que escreve um vetor de STRUCT (registros) um arquivo, e depois
lê esta informação do arquivo e mostra na tela. Neste exemplo são lidas e gravadas
informações (código e nome) para 3 pessoas.
#include <stdio.h>
typedef struct {
int codigo;
char nome[30];
} tipoDadosDeFuncionario;
int main() {
FILE *fp;
Prof. Bruno Macchiavello 7
FILE *fp;
tipoDadosDeFuncionario dadosDeFuncionario[3], dadoslidos[3];
int i;
char nomeArquivo[50];
strcpy(nomeArquivo, "arqbin1.bin");
if (fopen(nomeArquivo, "a+b") == NULL) {
fp = fopen(nomeArquivo, "wb");
} else { 
fp = fopen(nomeArquivo, "a+b");
}
/* CONTINUA NO PRÓXIMO SLIDE */
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
/* CONTINUAÇÃO DO SLIDE ANTERIOR*/
for (i = 0; i<3; i++ ) {
printf("Informe o nome: ");
scanf("%s", dadosDeFuncionario[i].nome);
printf("Informe o cod: ");
scanf("%d", &dadosDeFuncionario[i].codigo);
}
fwrite(dadosDeFuncionario,sizeof(tipoDadosDeFuncionario),3,fp);
Grava no arquivo de uma vez 
só todo o vetor com 3 registros.
Prof. Bruno Macchiavello 8
fwrite(dadosDeFuncionario,sizeof(tipoDadosDeFuncionario),3,fp);
fclose(fp);
fp = fopen(nomeArquivo,"a+b");
fread(&dadoslidos, sizeof(tipoDadosDeFuncionario),3,fp);
for (i = 0; i<3; i++ ) {
printf("\n\nNome: %s",dadoslidos[i].nome);
printf("\nCod: %d",dadoslidos[i].codigo);
getchar();
getchar();
}
}
Lê 3 registros de uma vez do arquivo,
e grava direto os 3 no vetor dadoslidos.
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Arquivo Binário
• Note que temos a facilidade na manipulação de
arquivos binários
• Para fazer isto com arquivo de texto seria mais• Para fazer isto com arquivo de texto seria mais
complexo.
• Porém tente abrir o arquivoBinario.bin no
notepad e veja que não conseguimos lê-lo
facilmente!
Prof. Bruno Macchiavello 9
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Arquivos
• ATENÇÃO:
• Toda vez que estamos trabalhando com
arquivos, há uma espécie de posição atual no
stream. Esta é a posição de onde será lido oustream. Esta é a posição de onde será lido ou
escrito o próximo caractere. Normalmente, num
acesso seqüencial a um arquivo, não temos que
mexer nesta posição pois quando lemos um
caractere a posição no arquivo é
automaticamente atualizada. Num acesso
randômico teremos que mexer nesta posição.
Prof. Bruno Macchiavello 10
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
FSEEK()
• fseek(): para se fazer procuras e acessos randômicos 
em arquivos usa-se a função fseek(). Esta move a 
posição corrente de leitura ou escrita no arquivo de um 
valor especificado, a partir de um ponto especificado.fseek (FILE *fp, deslocamento em bytes,origem); fseek (FILE *fp, deslocamento em bytes,origem); 
� O parâmetro origem determina a partir de onde os deslocamento 
em bytes de movimentação serão contados. Os valores 
possíveis são definidos por macros em stdio.h e são: 
o SEEK_SET = 0 = Início do arquivo 
o SEEK_CUR = 1 = Ponto corrente no arquivo 
o SEEK_END = 2 = Fim do arquivo 
� Tendo-se definido a partir de onde irá se contar, deslocamento 
em bytes determina quantos bytes de deslocamento serão 
dados na posição atual. 
Prof. Bruno Macchiavello 11
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo: um programa que escreve um vetor de STRUCT (registros) um arquivo com
informações (código e nome) para 5 pessoas. Depois o programa acessa, lê, e mostra o
terceiro registro gravado no arquivo.
#include <stdio.h>
typedef struct {
int codigo;
char nome[30];
} tipoDadosDeFuncionario;
int main() {
FILE *fp;
Prof. Bruno Macchiavello 12
FILE *fp;
tipoDadosDeFuncionario dadosDeFuncionario[5], dadoslidos;
int i;
char nomeArquivo[50];
strcpy(nomeArquivo, "arqbin1.bin");
if (fopen(nomeArquivo, "a+b") == NULL) {
fp = fopen(nomeArquivo, "wb");
} else { 
fp = fopen(nomeArquivo, "a+b");
}
/* CONTINUA NO PRÓXIMO SLIDE */
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
/* CONTINUAÇÃO DO SLIDE ANTERIOR*/
for (i = 0; i<5; i++ ) {
printf("Informe o nome: ");
scanf("%s", dadosDeFuncionario[i].nome);
printf("Informe o cod: ");
scanf("%d", &dadosDeFuncionario[i].codigo);
}
fwrite(&dadosDeFuncionario,sizeof(tipoDadosDeFuncionario),5,fp);
fclose(fp); Posiciona o ponteiro do arquivo 
Grava no arquivo de uma vez 
só todo o vetor com 5 registros.
Prof. Bruno Macchiavello 13
fclose(fp);
fopen(nomeArquivo,"a+b");
fseek (fp,(sizeof(tipoDadosDeFuncionario)*2),0);
fread(&dadoslidos, sizeof(tipoDadosDeFuncionario),1,fp);
printf("\n\nNome: %s",dadoslidos.nome);
printf("\nCod: %d",dadoslidos.codigo);
getchar();
getchar();
}
Posiciona o ponteiro do arquivo 
no início do 3o registro.
Lê um registro a partir da posição 
onde o ponteiro se encontra, 
no caso o 3o registro.
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fopen
Protótipo: FILE *fopen (char *nome_do_arquivo,char
*modo);
• O primeiro parâmetro "nome_do_arquivo": é o local 
onde o arquivo se encontra ou se for criado, onde o 
arquivo deve ser armazenado. 
• O segundo parâmetro "*modo": especifica como o 
arquivo deve ser aberto. Abaixo uma tabela 
mostrando os modos possíveis:
Prof. Bruno Macchiavello 14
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fclose
Protótipo: int fclose (FILE *fp);
• O ponteiro fp passado à função fclose() • O ponteiro fp passado à função fclose() 
determina o arquivo a ser fechado. A função 
retorna zero no caso de sucesso.
Prof. Bruno Macchiavello 15
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• putc ou fputc
Escreve um caractere no arquivo.
Protótipo: int putc (int ch,FILE *fp);Protótipo: int putc (int ch,FILE *fp);
• Parâmetro 1: "int ch" - caracter a ser escrito no 
arquivo (pode ser uma variável).
• Parâmetro 2: "FILE *fp" - o arquivo a ser escrito.
Prof. Bruno Macchiavello 16
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• getc ou fgetc
Retorna um caractere lido do arquivo.
Protótipo: int getc (FILE *fp);Protótipo: int getc (FILE *fp);
• Parâmetro: "FILE *fp" - o arquivo a ser lido.
Prof. Bruno Macchiavello 17
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• feof
EOF ("End of file") - indica o fim de um arquivo. 
Às vezes é necessário verificar se um arquivo 
chegou ao fim, para isto podemos usar a função 
feof(). Ela retorna não-zero se o arquivo chegou feof(). Ela retorna não-zero se o arquivo chegou 
ao EOF, caso contrário retorna zero.
Protótipo: int feof (FILE *fp);
• Parâmetro: "FILE *fp" - o arquivo a ser 
verificado.
Prof. Bruno Macchiavello 18
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fprintf
Escreve uma constante de caracteres em um 
arquivo, essa função funciona como printf, sendo 
que a diferença é a saída padrão, que em fprintf é 
um arquivo e em printf é o monitor.
Protótipo: int fprintf (FILE *fp, const char *format,...);
• Parâmetro 1: "FILE *fp" - o arquivo a ser escrito.
• Parâmetro 2: "const char *format" - o que será 
escrito.
Prof. Bruno Macchiavello 19
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fscanf
Lê uma constante de caracteres de um arquivo,
essa função funciona como scanf, sendo que a
diferença é a entrada padrão que em fscanf é um
arquivo e em scanf é o teclado.
Protótipo: int fscanf (FILE *fp, const char *format,...);
• Parâmetro 1: "FILE *fp" - o arquivo a ser lido.
• Parâmetro 2: "const char *format" - qual a variável
que receberá os dados do arquivo.
Prof. Bruno Macchiavello 20
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fgets
Lê uma string de um arquivo. A função lê a string até que um
caracter de nova linha seja lido /n ou tamanho-1 caracteres tenham
sido lidos. Se o caracter de nova linha for lido, ele fará parte da
string, o que não acontecia com gets. A string resultante sempre
terminará com /0 (por isto somente tamanho-1 caracteres, no
máximo, serão lidos).
Protótipo: char *fgets (char *str, int tamanho, FILE *fp);
• Parâmetro 1 "char *str": a variável que receberá a string.
• Parâmetro 2 "int tamanho": o limite máximo de caracteres a serem
lidos.
• Parâmetro 3 "FILE *fp": o arquivo que será lido.
Prof. Bruno Macchiavello 21
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fputs
Escreve uma string num arquivo.
Protótipo: char *fputs (char *str, FILE *fp);Protótipo: char *fputs (char *str, FILE *fp);
• Parâmetro 1: "char *str" - a variável que contém 
os dados a serem escritos no arquivo.
• Parâmetro 2: "FILE *fp" - o arquivo a ser escrito.
Prof. Bruno Macchiavello 22
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fread
Leitura de bloco de dados.
Protótipo: unsigned fread (void *buffer, int numero_de_bytes, int
count, FILE *fp);
• Parâmetro 1: "void *buffer" - variável na qual serão armazenados os • Parâmetro 1: "void *buffer"- variável na qual serão armazenados os 
dados lidos.
• Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser lido.
• Parâmetro 3: "int count" - indica quantas unidades devem ser lidas.
• Parâmetro 4: "FILE *fp" - arquivo a ser lido.
Prof. Bruno Macchiavello 23
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fwrite
Leitura de bloco de dados.
Protótipo: unsigned fwrite (void *buffer, int numero_de_bytes, int
count, FILE *fp);
• Parâmetro 1: "void *buffer" - variável na qual serão transmitidos os • Parâmetro 1: "void *buffer" - variável na qual serão transmitidos os 
dados ao arquivo.
• Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser 
escrito.
• Parâmetro 3: "int count" - indica quantas unidades devem ser 
escritas.
• Parâmetro 4: "FILE *fp" - arquivo a ser escrito.
Prof. Bruno Macchiavello 24
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• fseek
Procuras e acessos randômicos em arquivos. Esta move a posição corrente
de leitura ou escrita no arquivo de um valor especificado, a partir de um
ponto especificado.
Protótipo: int fseek (FILE *fp, long numbytes, int origem);
• Parâmetro 1: "FILE *fp" - arquivo a ser manipulado.• Parâmetro 1: "FILE *fp" - arquivo a ser manipulado.
• Parâmetro 2: "long numbytes" - indica quantos bytes o cursor de posição do
arquivo será movimentado apartir da sua posição atual.
• Parâmetro 3: "int origem" - indica apartir de onde os numbytes serão
contados. Abaixo uma tabela com os possíveis valores:
SEEK_SET 0 Início do arquivo
SEEK_CUR 1 Ponto corrente no arquivo
SEEK_END 2 Fim do arquivo
Prof. Bruno Macchiavello 25
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Resumo de Funções de Arquivos
• rewind
Retorna a posição corrente do arquivo para o
início.
• Protótipo: void rewind (FILE *fp);
• Parâmetro: "FILE *fp" - arquivo a ser
manipulado.
Prof. Bruno Macchiavello 26
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exercícios
• Fazer o trabalho 4 !!
Prof. Bruno Macchiavello 27

Continue navegando