ficheiros binÁrios · - o endereço de uma variável do tipo file que contém o endereço do...

21
1/21 FICHEIROS BINÁRIOS Ficheiros Binários Programação II

Upload: others

Post on 30-Apr-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: FICHEIROS BINÁRIOS · - 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

1/21

FICHEIROS BINÁRIOS

Ficheiros Binários Programação II

Page 2: FICHEIROS BINÁRIOS · - 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

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

Page 3: FICHEIROS BINÁRIOS · - 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

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

Page 4: FICHEIROS BINÁRIOS · - 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

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

Page 5: FICHEIROS BINÁRIOS · - 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

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

Page 6: FICHEIROS BINÁRIOS · - 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

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

Page 7: FICHEIROS BINÁRIOS · - 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

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

Page 8: FICHEIROS BINÁRIOS · - 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

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

Page 9: FICHEIROS BINÁRIOS · - 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

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

Page 10: FICHEIROS BINÁRIOS · - 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

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

Page 11: FICHEIROS BINÁRIOS · - 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

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

Page 12: FICHEIROS BINÁRIOS · - 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

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

Page 13: FICHEIROS BINÁRIOS · - 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

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

Page 14: FICHEIROS BINÁRIOS · - 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

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

Page 15: FICHEIROS BINÁRIOS · - 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

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

Page 16: FICHEIROS BINÁRIOS · - 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

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

Page 17: FICHEIROS BINÁRIOS · - 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

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

Page 18: FICHEIROS BINÁRIOS · - 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

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

Page 19: FICHEIROS BINÁRIOS · - 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

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

Page 20: FICHEIROS BINÁRIOS · - 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

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

Page 21: FICHEIROS BINÁRIOS · - 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

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