ficheiros binÁrios · - o endereço de uma variável do tipo file que contém o endereço do...
TRANSCRIPT
1/21
FICHEIROS BINÁRIOS
Ficheiros Binários Programação II
Funções para manipulação de ficheiros 2/21
Funções para manipulação de ficheiros
fopen
abertura de um ficheiro para leitura/entrada e escrita/saída
fclose
fecho de um ficheiro
fwrite
escrita de dados
fread
leitura de dados
Ficheiros Binários Programação II
Funções para manipulação de ficheiros 3/21
ftell
determina a posição corrente/atual do marcador
rewind
desloca o marcador para o início do ficheiro
fseek
desloca o marcador um número de bytes desde início, posição corrente ou fim
Ficheiros Binários Programação II
Abertura de um ficheiro 4/21
Abertura de um ficheiro
FILE *fopen (const char *filename, const char *mode)
filename
string com o nome externo (físico) do ficheiro que se pretende abrir
mode
string com o modo de abertura do ficheiro, e que pode ser de 4 tipos:
- “rb” (abertura do ficheiro para leitura)
- “wb” (abertura do ficheiro para escrita)
- “ab” (abertura do ficheiro para escrita no fim do ficheiro)
- “rb+” (abertura do ficheiro para leitura e escrita)
Devolve:
- o endereço de uma variável do tipo FILE que contém o endereço do ficheiro lógico, se
aberto com sucesso, ou
- NULL, se houver algum erro de abertura
Ficheiros Binários Programação II
Abertura de um ficheiro 5/21
Modo de abertura de um ficheiro
- “rb” (abertura do ficheiro para leitura)
- se o ficheiro existe, então coloca o marcador no início do ficheiro
- “wb” (abertura do ficheiro para escrita)
- se ficheiro existe, então esvazia ficheiro e coloca o marcador no início do ficheiro
- se ficheiro não existe, então cria-o e coloca o marcador no início do ficheiro
- “ab” (abertura do ficheiro para escrita no fim do ficheiro)
- se ficheiro existe, então coloca o marcador no fim do ficheiro
- se ficheiro não existe, então cria-o e coloca o marcador no início do ficheiro
- “rb+” (abertura do ficheiro para leitura e escrita)
Ficheiros Binários Programação II
Fecho de um ficheiro 6/21
Fecho de um ficheiro
int fclose (FILE *file)
file
variável que contém o endereço do ficheiro lógico que se pretende fechar
Devolve:
- 0 (zero), se o ficheiro foi fechado com sucesso,
- EOF (-1), se houver algum erro no fecho do ficheiro
Ficheiros Binários Programação II
Escrita de dados num ficheiro 7/21
Escrita de dados num ficheiro
int fwrite (void *ptr, int size, int n, FILE *file)
ptr
endereço inicial da zona de memória que contém os dados a escrever
size
número de bytes que cada um dos dados ocupa
n
número de dados a escrever
file
endereço do ficheiro lógico onde escrever
Devolve:
- o número de elementos que escreveu no ficheiro (e não o número de bytes)
Consequências:
- avança o marcador para o fim do ficheiro
Ficheiros Binários Programação II
Escrita de dados num ficheiro 8/21
Exemplos
int fwrite (void *ptr, int size, int n, FILE *file)
fwrite (&X, sizeof(float), 1, f)
- escreve no ficheiro f, 1 número real (com sizeof(float) bytes) que se encontra no
endereço de X; ou seja, escreve no ficheiro f o número real da variável X
fwrite (V, sizeof(int), 10, f)
- escreve no ficheiro f os 10 primeiros números inteiros (cada um com sizeof(int)
bytes) do vetor V; ou seja, escreve no ficheiro f os inteiros V[0], …., V[9]
fwrite (&V[5], sizeof(int), 5, f)
- escreve no ficheiro f, 5 valores inteiros (com sizeof(int) bytes) do vetor V a partir
do 6º elemento; ou seja, escreve no ficheiro f os inteiros V[5], …., V[9]
Ficheiros Binários Programação II
Escrita de dados num ficheiro 9/21
Exemplo#include <stdio.h>
#include <stdlib.h>
. . .
main() {
int i, TAM = 5;
CLIENTE *C;
FILE *fb;
C = (CLIENTE *) malloc(TAM * sizeof(CLIENTE));
for (i = 0; i < TAM; i++) {
printf("Insira o NC: "); scanf("%d", &C[i].NC);
printf("Insira o nome: "); scanf("%s", C[i].Nome);
printf("Insira a idade: "); scanf("%d", &C[i].Idade);
}
fb = fopen("Teste.dat", "wb");
fwrite(&TAM, sizeof(int), 1, fb);
fwrite(C, sizeof(CLIENTE), TAM, fb);
fclose(fb);
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Leitura de dados de um ficheiro 10/21
Leitura de dados de um ficheiro
int fread (void *ptr, int size, int n, FILE *file)
ptr
endereço inicial da zona de memória que recebe os dados a ler
size
número de bytes que cada um dos dados ocupa
n
número de dados a ler
file
endereço do ficheiro lógico a ler
Devolve:
- o número de elementos que leu do ficheiro (e não o número de bytes)
Consequência:
- avança o marcador no ficheiro o número de bytes lidos
Ficheiros Binários Programação II
Leitura de dados de um ficheiro 11/21
Leitura de dados de um ficheiro
Exemplos
int fread (void *ptr, int size, int n, FILE *file)
fread (&X, sizeof(float), 1, f)
- lê do ficheiro f, 1 bloco de sizeof(float) bytes e converte-o num real que atribuí à
variável do tipo real X
fread (V, sizeof(int), 10, f)
- lê do ficheiro f, 10 blocos de sizeof(int) bytes e converte-os em 10 números inteiros
que atribuí a V[0], V[1], …, V[9], respetivamente
fread (&V[2], sizeof(int), 5, f)
- lê do ficheiro f, 5 blocos de sizeof(int) bytes e converte-os em 5 números inteiros
que atribuí aos elementos do vetor V, V[2], V[3], …, V[6], respetivamente
Ficheiros Binários Programação II
Leitura de dados de um ficheiro 12/21
Exemplo 1 – leitura de uma só vez. . .
main() {
int i, TAM;
CLIENTE *C;
FILE *fb;
fb = fopen("Teste.dat", "rb");
fread(&TAM, sizeof(int), 1, fb);
C = (CLIENTE *) malloc(TAM * sizeof(CLIENTE));
fread(C, sizeof(CLIENTE), TAM, fb);
fclose(fb);
for (i = 0; i < TAM; i++) {
printf("NC = %d\n", C[i].NC);
printf("Nome = %s\n", C[i].Nome);
printf("Idade = %d\n", C[i].Idade);
}
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Leitura de dados de um ficheiro 13/21
Exemplo 2 – leitura um a um. . .
main() {
int i, TAM;
CLIENTE *C;
FILE *fb;
fb = fopen("Teste.dat", "rb");
fread(&TAM, sizeof(int), 1, fb);
C = (CLIENTE *) malloc(TAM * sizeof(CLIENTE));
for (i = 0; i < TAM; i++)
fread(&C[i], sizeof(CLIENTE), 1, fb);
fclose(fb);
for (i = 0; i < TAM; i++) {
printf("NC = %d\n", C[i].NC);
printf("Nome = %s\n", C[i].Nome);
printf("Idade = %d\n", C[i].Idade);
}
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Determinar a posição corrente/atual do marcador 14/21
Determinar a posição corrente/atual do marcador
long ftell (FILE *file)
file
endereço do ficheiro lógico a tratar
Devolve:
- a posição corrente/atual do marcador (em bytes)
Ficheiros Binários Programação II
Determinar a posição corrente/atual do marcador 15/21
Exemplo. . .
main() {
int i, TAM;
long pos;
CLIENTE *C;
FILE *fb;
fb = fopen("Teste.dat", "rb");
pos = ftell(fb); printf("Pos = %ld\n", pos);
fread(&TAM, sizeof(int), 1, fb);
pos = ftell(fb); printf("Pos = %ld\n", pos);
C = (CLIENTE *) malloc(TAM * sizeof(CLIENTE));
for (i = 0; i < TAM; i++) {
fread(&C[i], sizeof(CLIENTE), 1, fb);
pos = ftell(fb); printf("Pos = %ld\n", pos);
}
fclose(fb);
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Deslocar o marcador para o início do ficheiro 16/21
Deslocar o marcador para o início do ficheiro
void rewind (FILE *file)
file
endereço do ficheiro lógico a tratar
Ficheiros Binários Programação II
Deslocar o marcador para o início do ficheiro 17/21
Exemplomain() {
int i, TAM;
long pos;
CLIENTE *C;
FILE *fb;
fb = fopen("Teste.dat", "rb");
pos = ftell(fb); printf("Pos = %ld\n", pos);
fread(&TAM, sizeof(int), 1, fb);
printf("TAM = %d\n", TAM);
pos = ftell(fb); printf("Pos = %ld\n", pos);
rewind(fb);
pos = ftell(fb); printf("Pos = %ld\n", pos);
fread(&TAM, sizeof(int), 1, fb);
pos = ftell(fb); printf("Pos = %ld\n", pos);
fclose(fb);
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Deslocar o marcador um número de bytes 18/21
Deslocar o marcador um número de bytes
int fseek(FILE *file, long salto, int origem)
file
endereço do ficheiro lógico a tratar
salto
designa o valor em bytes que pretende deslocar relativamente a origem
(valor positivo salto para a frente; valor negativo salto para trás)
origem, três valores possíveis, representados pelas seguintes constantes:
- SEEK_SET: início do ficheiro
- SEEK_CUR:posição corrente/atual do ficheiro
- SEEK_END: fim do ficheiro
Devolve:
- 0 (zero), se a operação teve sucesso
- um valor não nulo, se a operação não teve sucesso
Ficheiros Binários Programação II
Deslocar o marcador um número de bytes 19/21
Exemplo 1main() {
int i, TAM;
long pos;
CLIENTE Elem;
FILE *fb;
fb = fopen("Teste.dat", "rb");
pos = ftell(fb); printf("Pos = %ld\n", pos);
fread(&TAM, sizeof(int), 1, fb);
printf("TAM = %d\n", TAM);
pos = ftell(fb); printf("Pos = %ld\n", pos);
fseek(fb, 28, SEEK_CUR);
pos = ftell(fb); printf("Pos SEEK_CUR 1 = %ld\n", pos);
fread(&Elem, sizeof(CLIENTE), 1, fb);
printf("NC = %d\n", Elem.NC);
printf("Nome = %s\n", Elem.Nome);
printf("Idade = %d\n", Elem.Idade);
pos = ftell(fb); printf("Pos SEEK_CUR 2 = %ld\n", pos);
fclose(fb);
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Deslocar o marcador um número de bytes 20/21
Exemplo 2main() {
int i, TAM;
long pos;
CLIENTE Elem;
FILE *fb;
fb = fopen("Teste.dat", "rb");
pos = ftell(fb); printf("Pos = %ld\n", pos);
fread(&TAM, sizeof(int), 1, fb);
printf("TAM = %d\n", TAM);
pos = ftell(fb); printf("Pos = %ld\n", pos);
fseek(fb, -28, SEEK_END);
pos = ftell(fb); printf("Pos SEEK_END 1 = %ld\n", pos);
fread(&Elem, sizeof(CLIENTE), 1, fb);
printf("NC = %d\n", Elem.NC);
printf("Nome = %s\n", Elem.Nome);
printf("Idade = %d\n", Elem.Idade);
pos = ftell(fb); printf("Pos SEEK_END 2 = %ld\n", pos);
fclose(fb);
}
typedef struct {
int NC;
char Nome[20];
int Idade;
} CLIENTE;
Ficheiros Binários Programação II
Deslocar o marcador um número de bytes 21/21
Exemplo 3main() {
int i, TAM ; long pos;
CLIENTE *C;
FILE *fb;
fb = fopen("Teste.dat", "rb");
pos = ftell(fb); printf("Pos = %ld\n", pos);
fread(&TAM, sizeof(int), 1, fb);
printf("TAM = %d\n", TAM);
pos = ftell(fb); printf("Pos = %ld\n", pos);
C = (CLIENTE *) malloc(TAM * sizeof(CLIENTE));
fseek(fb, 4, SEEK_SET);
pos = ftell(fb); printf("Pos SEEK_SET 1 = %ld\n", pos);
for (i = 0; i < TAM; i++) {
fread(&C[i], sizeof(CLIENTE), 1, fb);
pos = ftell(fb); printf("Pos SEEK_SET 2 = %ld\n", pos);}
for (i = 0; i < TAM; i++)
printf("NC = %d\nNome = %s\nIdade = %d\n", C[i].NC, C[i].Nome, C[i].Idade);
fclose(fb);}
typedef struct {int NC;char Nome[20];int Idade;
} CLIENTE;
Ficheiros Binários Programação II