Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
II
Arquivos
(Arquivos)
1 / 57
Arquivos - Introdu
c
ao
Tipos de Arquivos
Podemos dividir os arquivos em 2 tipos: Arquivos Texto
e arquivos bin
arios.
Arquivos Texto sao arquivos que nao possuem um
formato definido, sendo composto apenas por
sequencias de bytes. Podemos ler e escrever
sequencias de bytes em arquivos de forma
semelhante a ler strings do teclado e escrever
strings na tela. Caso seja armazenado um valor
ex: 1234567 esse numero gastara 7 bytes pois
cada um de seus dgitos e representado como
um caractere. No windows um arquivo texto
(Arquivos) possue um caractere marcador de fim de
2 / 57
Arquivos - Introdu
c
ao
Tipos de Arquivos - continua
ca
o
Arquivos bin
arios sao arquivos que possuem uma
estrutura definida atraves de um typedef ou
struct e podemos ler ou gravar elementos com
estas estruturas. Podemos tambem gravar o
valor de variaveis int, float, double, etc. Caso
seja armazenado o valor de numero inteiro
1234567 esse numero (que e um inteiro de 32
bits) gastara 4 bytes de espaco pois um inteiro
ocupa 4 bytes.
(Arquivos)
3 / 57
4 / 57
Vis
ao dos arquivos
(Arquivos)
5 / 57
Vis
ao dos arquivos
A linguagem C promove suporte `a utilizacao de
arquivos por meio da biblioteca stdio.h;
Esta biblioteca fornece varias funcoes para
manipulacao de arquivos;
Realizada atraves de um de dado ponteiro, chamado
FILE;
Uma variavel do tipo ponteiro FILE e capaz de
identificar um arquivo no disco, direcionando para ele
todas as operacoes.
(Arquivos)
6 / 57
(Arquivos)
7 / 57
Vis
ao dos arquivos
Essas variaveis sao declaradas como qualquer outro tipo
de ponteiro:
FILE *arq, *pont;
Na linguagem C, os dados podem ser gravados em
arquivos binarios ou de texto. Arquivos de texto podem
ser lidos diretamente. Arquivos binarios devem ser lidos
por programas especiais, que convertem a cadeia de bits
em informacoes compreensveis.
(Arquivos)
8 / 57
fopen ()
Abre um arquivo
fclose()
Fecha um arquivo
fputc() e fputs() Escreve um caractere e uma string no
arquivo
fgetc() e fgets() Le um caractere e uma string de um
arquivo
fseek()
Posiciona o arquivo em um byte especfico
para um arquivo o que printf() e para
fprintf()
E
o console
para um arquivo o que scanf() e para
fscanf()
E
o console
(Arquivos)
9 / 57
feof()
(Arquivos)
10 / 57
fopen
Prototipo: FILE *fopen (char *nome do arquivo,char
*modo);
O primeiro parametro nome do arquivo: e o local
onde o arquivo se encontra ou se for criado, onde o
arquivo deve ser armazenado.
O segundo parametro modo: especifica como o
arquivo deve ser aberto.
r
Abre um arquivo apenas para leitura.
w Abrir um arquivo apenas para gravacao.
a
Adiciona dados ao final do arquivo
rb Abre um arquivo binario para leitura.
wb Cria um arquivo binario para escrita
ab Acrescenta dados binarios no fim do arquivo
(Arquivos)
11 / 57
fopen
Continuacao:
wb
Cria um arquivo binario onde poderao ser realizadas
ab
Anexa novos dados a uma arquivo binario
r+
Abre um arquivo de texto para leitura e escrita
w+ Cria um arquivo de texto para leitura e escrita
rb+ Abre um arquivo binario para leitura e escrita
wb+ Cria um arquivo binario para leitura e escrita
(Arquivos)
12 / 57
Exemplo:Abrindo e fechando
arquivos
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
main()
{
char *str1 = "/mnt/wind/teste/dbase/dbase";
FILE *fp; /* Declarao da estrutura */
fp=fopen (str1,"wb"); /* o arquivo se chama dbase
est localizado no diretrio /mnt/wind/teste/dbase
*/
if (!fp)
printf ("Erro na abertura do arquivo.");
else
printf("Arquivo aberto com sucesso.");
(Arquivos)
13 / 57
fopen
(Arquivos)
14 / 57
fopen
(Arquivos)
15 / 57
fclose
A funcao fclose() fecha um arquivo. Quando ocorrer
algum erro durante a execucao da funcao, podera
haver perda de dados ou ate mesmo perda do
arquivo;
A sintaxe da funcao e:
fclose(FILE *stream);
onde: stream e a referencia para o arquivo (arq e o
ponteiro obtido quando o arquivo foi aberto)
(Arquivos)
16 / 57
fclose
Quando a funcao fclose() e executada, gera como
resultado um numero inteiro. Se este numero for
igual a zero, significa que o arquivo foi fechado
corretamente.
Qualquer problema que ocorra com a execucao de
um programa podera corromper, ou seja, danificar os
arquivos que estiverem abertos. Assim, e
aconselhavel que arquivos sejam mantidos abertos o
menor tempo possvel.
(Arquivos)
17 / 57
ferror
(Arquivos)
18 / 57
Arquivos Texto
(Arquivos)
19 / 57
Gravando caracteres em um
arquivo - fputc
A funcao fputc() escreve um caractere em um
arquivo.
A sintaxe e:
fputc(char ch, FILE *stream);
onde:
ch e o caractere que sera escrito no arquivo;
stream e referencia para o arquivo onde o caractere
sera escrito.
(Arquivos)
20 / 57
(Arquivos)
21 / 57
(Arquivos)
22 / 57
Exemplo:lendo e gravando
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
main() {
FILE *arq;
char caractere;
arq = fopen("arquivo.txt","r");
if (arq != NULL) {
while (!feof(arq)) {
caractere = fgetc(arq);
if (ferror(arq))
printf("\nOcorreu um erro de leitura.");
else {
printf("\nLeitura realizada com sucesso");
printf("\nCaracter lido: %c", caractere);
}
}
fclose(arq);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
23 / 57
(Arquivos)
24 / 57
Exemplo:fputs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
main() {
FILE *arq;
char nome[30];
arq = fopen("sequencia.txt","a");
if (arq != NULL) {
printf("Digite um nome: ");
gets(nome);
while (strcmp(nome, "fim") != 0) {
fputs(strcat(nome,"\n"), arq);
if (ferror(arq))
printf("\nOcorreu um erro na gravao .");
else {
printf(" Gravao realizada com sucesso");
printf("\nDigite um nome: ");
fflush(stdin);
gets(nome);
}
}
fclose(arq);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
25 / 57
26 / 57
Exemplo:fgets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
main() {
FILE *arq;
char nome[30];
arq = fopen("sequencia.txt","r");
if (arq != NULL) {
fgets(nome, 30, arq);
if (ferror(arq))
printf("\nOcorreu um erro de leitura.");
while (!feof(arq)) {
printf("\nLeitura realizada com sucesso");
printf("\nCadeia lida: %s", nome);
fgets(nome, 30, arq);
if (ferror(arq))
printf("\nOcorreu um erro de leitura.");
}
fclose(arq);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
27 / 57
(Arquivos)
28 / 57
Exemplo:fprintf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
main() {
FILE *arq;
char nome[30];
arq = fopen("sequencia.txt","w");
if (arq != NULL) {
printf("Digite um nome: ");
gets(nome);
while (strcmp(nome, "fim") != 0) {
fprintf(arq, "%s\n", nome);
if (ferror(arq))
printf("\nOcorreu um erro na gravao .");
else {
printf(" Gravao realizada com sucesso");
printf("\nDigite um nome: ");
fflush(stdin);
gets(nome);
}
}
fclose(arq);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
29 / 57
30 / 57
Exemplo:fscanf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
main() {
FILE *arq;
char nome[30];
arq = fopen("sequencia.txt","r");
if (arq != NULL) {
fscanf(arq, "%s", &nome);
if (ferror(arq))
printf("\nOcorreu um erro de leitura.");
while (!feof(arq)) {
printf("\nLeitura realizada com sucesso");
printf("\nCadeia lida: %s", nome);
fscanf(arq, "%s", &nome);
if (ferror(arq))
printf("\nOcorreu um erro de leitura.");
}
fclose(arq);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
31 / 57
Exerccio 1:
(Arquivos)
32 / 57
Exerccio 2:
(Arquivos)
33 / 57
Exerccio 3:
(Arquivos)
34 / 57
Arquivos bin
arios
Os proximos slides apresentam as funcoes que podem ser
utilizadas com arquivos binarios.
Em C arquivos textos nao podem ser associados a
um registro (struct), pois armazenam uma sequencia
de caracteres;
Quando isso for necessario devera se trabalhar com
arquivos binarios;
Toda vez que uma operacao de leitura ou de escrita
for realizada, devera ser informado o numero de bytes
que serao lidos ou gravados (sizeof);
(Arquivos)
35 / 57
36 / 57
Exemplo:fwrite
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
typedef struct {
int numero;
char nome[30];
} cliente;
main() {
FILE *cli;
cliente c;
cli = fopen("clientes.dat","ab+");
if (cli != NULL) {
printf("Digite o nmero do cliente: ");
scanf("%d",&c.numero);
printf("Digite o nome do cliente: ");
fflush(stdin);
gets(c.nome);
fwrite(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na gravao .");
else
printf("\ nGravao realizada com sucesso.");
fclose(cli);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
37 / 57
Exemplo:fread
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
typedef struct {
int numero;
char nome[30];
} cliente;
main() {
FILE *cli;
cliente c;
cli = fopen("clientes.dat","ab+");
if (cli != NULL) {
fread(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na leitura.");
while (!feof(cli)) {
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s",c.nome);
fread(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na leitura.");
}
fclose(cli);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
39 / 57
(Arquivos)
40 / 57
Exemplo:rewind
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
typedef struct {
int numero;
char nome[30];
} cliente;
main() {
FILE *cli;
cliente c;
cli = fopen("clientes.dat","ab+");
if (cli != NULL) {
fread(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na leitura.");
while (!feof(cli)) {
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s",c.nome);
fread(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na leitura.");
}
(Arquivos)
41 / 57
Exemplo:rewind
1
2
3
4
5
6
7
8
9
rewind(cli);
fread(&c, sizeof(cliente), 1, cli);
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s\n",c.nome);
fclose(cli);
} else
printf("Ocorreu um erro.");
getch();
}
(Arquivos)
42 / 57
Movimentando o cursor do
arquivo - fseek
Sua sintaxe e:
fseek(FILE *arq, long qtd bytes, int posicao);
onde:
arq representa o arquivo que sera percorrido pela
funcao fseek.
qtd bytes
representa a quantidade de bytes que o cursor sera
movimentado a partir de posicao.
posicao representa o ponto a partir do qual a
movimentacao sera executada, podendo assumir tres
valores: 0, 1, 2.
(Arquivos)
43 / 57
Movimentando o cursor do
arquivo - fseek
fseek(arq, i, 0); posiciona o cursor no byte de numero
i;
fseek(arq, i, 1); desloca o cursor i posicoes `a frente
da posicao atual (o valor i pode ser negativo);
fseek(arq, -i, 2); desloca o cursor i bytes antes do fim
do arquivo; caso o valor de i seja zero, ele vai para o
fim;
(Arquivos)
44 / 57
Exemplo:fseek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
typedef struct {
int numero;
char nome[30];
} cliente;
main() {
FILE *cli;
cliente c;
cli = fopen("clientes.dat","ab+");
if (cli != NULL) {
fread(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na leitura.");
(Arquivos)
45 / 57
Exemplo:fseek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
while (!feof(cli)) {
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s",c.nome);
fread(&c, sizeof(cliente), 1, cli);
if (ferror(cli))
printf("\nOcorreu um erro na leitura.");
}
fseek(cli, 0, 0);
fread(&c, sizeof(cliente), 1, cli);
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s",c.nome);
fseek(cli, sizeof(cliente), 1);
fread(&c, sizeof(cliente), 1, cli);
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s",c.nome);
fseek(cli, sizeof(cliente)*-1, 2);
fread(&c, sizeof(cliente), 1, cli);
printf("\n\nNmero do cliente: %d",c.numero);
printf("\nNome do cliente: %s",c.nome);
fclose(cli);
} else
printf("Ocorreu um erro.");
}
(Arquivos)
46 / 57
(Arquivos)
47 / 57
rename("c:\dir1\subdir1\arquivo.dat", "c:\dir1\subdir1\novo.d
(Arquivos)
48 / 57
Obtendo a posi
c
ao corrente de
um arquivo
A funcao ftell() indica a posicao corrente do ponteiro
do arquivo.
A sintaxe e:
ftell(FILE *arq);
Exemplo:
int tamanho=0;
Tamanho = ftell(arq);
(Arquivos)
49 / 57
Exerccio 4:
(Arquivos)
50 / 57
Exerccio 5:
(Arquivos)
51 / 57
Exerccio 6:
(Arquivos)
52 / 57
Exerccio 7:
Elabore um sistema que possibilite a criacao e a insercao
de nos em uma lista encadeada em memoria em ordem
alfabetica. A insercao de um no somente deve acontecer
se o mesmo nao existir na lista. Cada no deve ter um
campo elemento para armazenar o conteudo alfanumerico
(vetor de caracteres de N posicoes). Apos a adicao do no
o TAD que contem todas as informacoes de determinada
entidade (por exemplo um aluno) deve ser gravado em um
arquivo. O no deve ainda ter um campo de referencia
(posicao) para o TAD que sera gravado em arquivo.
(Arquivos)
53 / 57
Exerccio 8:
(Arquivos)
54 / 57
Exerccio 9:
(Arquivos)
55 / 57
Exerccio 10:
Complemente o exerccio anterior implementando uma
funcao que possibilite a atualizacao das informacoes de
determinado TAD que nao fazem parte da chave/campo
utilizada na composicao da lista. Para tal siga os
seguintes passos:
Localize o registro que se deseja alterar; Abra o arquivo
de dados; Obtenha o registro utilizando o campo posicao
da lista; Atualize as informacoes no registro recuperado;
Desloque o cursor para a posicao do registro desejado;
Armazene novamente o registro na mesma posicao; Feche
o arquivo de dados.
(Arquivos)
56 / 57
Exerccio 11:
Complemente o exerccio anterior implementando uma
funcao que possibilite a eliminacao de determinado no e
do registro correspondente de maneira logica. Para tal, o
TAD deve agora conter um campo de controle para
informar se este e valido ou nao (int ou char). Os
seguintes passos devem ser considerados:
Localize o registro que se deseja alterar; Abra o arquivo
de dados; Obtenha o registro utilizando o campo posicao
da lista; Posicione o cursor no registro desejado; Atualize
a informacao no campo de controle; Armazene novamente
o registro na mesma posicao; Feche o arquivo de dados.
(Arquivos)
57 / 57