Você está na página 1de 16

Programação II

Arquivos

Prof. Luís Otávio Rigo Júnior


DECOM / CEUNES - UFES

Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

1
Boas práticas de programação!

• Iniciar com pseudo-código;

• Identação e comentários;

• Nomes significativos;

• Início e fim de bloco;

• Modularizar c/ caixas pretas;

• Otimizar como último passo.

Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

2
Introdução
• Programas manipulam variáveis;
– Forma abstrata de enxergar os dados;
– Internamente indicam células de memória.

• Até o momento manipulamos apenas a


memória principal;
– Elas deixam de existir quando o programa
acaba;
– Chamada de memória transiente.

Introdução
• Conheceremos outro tipo de memória,
chamada de memória persistente;
– Conteúdo “permanente” e acessado por outros
programas;
– Tem capacidade de manter as informações por
um longo tempo.
– Manipulação e acesso mais lento!

• O conceito por trás das variáveis


persistentes é o de arquivo:
– Permitem o armazenamento, acesso e
processamento futuro.

3
Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

Tipos de arquivos
• Os arquivos são tipos de streams:
– Sequências de informações.

• Existem 2 tipos de arquivos:


– Arquivos texto;
– Arquivos binários.
• Possuem a mesma finalidade;
• O programador define o tipo que o arquivo
pertence:
– Isto determinará o formato das variáveis ele
gravará e acessará do arquivo.

4
Tipos de arquivos – Arquivos texto
• Um arquivo texto é uma sequência de
caracteres;
• Pode ser aberto no editor de texto
convencional!
– Seu sentido e alteração continuará fazer sentido.
Exemplo de arquivo texto com
impressão de 3 variáveis: Representação de um
real = 145.65 arquivo texto:
lista = “Lista de caracteres!” 145.65
inteiro = 674 Lista de caracteres!
674

Tipos de arquivos – Arquivos binários


• Um arquivo binário é uma sequência de
bytes;
• O arquivo torna-se um espelho da memória
principal. Representação de um
arquivo binário:
01011011011101011
Exemplo de arquivo binário com
impressão de 3 variáveis: 01010101011010011
01010111101110001
real = 145.65
lista = “Lista de caracteres!”
inteiro = 674 Sua visualização:
8%x$yaIh109K#a$$$
ak;;79@!ia.2.?m

5
Algumas diferenças
• Arquivos binários usam menos memória do
que arquivos texto;
– Exemplo:
• Número inteiro: 45
– Armazenamento:
• Texto: 1 byte para cada caracter
• Binário: apenas 1 byte

• Um conjunto de variáveis (struct) pode ser


acessada e armazenada com um único
comando.

Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

6
Definição de arquivos
• Para que os arquivos possam ser utilizados
por programas, eles devem ser tratados
como variáveis;
• Como tratamos uma variável?
– Declaramos!
– Tipo: FILE
• Exemplo:
FILE *arq;
• Que biblioteca?
#include <stdio.h>

Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

7
Operação sobre arquivos
• Todas as operações são realizadas através
de funções!
– O que lembra um TAD!!!

• Principais operações:
– Abertura e fechamento - gerais;

• Outras operações:
– Leitura e escrita – dependente do tipo de
arquivos;

Operação sobre arquivos - Abertura


• Abertura de arquivos:
– É realizada através da função fopen().

• Protótipo da função fopen():


1. FILE *fopen(const char *nomearq,
const char *modo);
• Descrição:
– const: indica que a variável não pode ser
modificada dentro da função;
– nomearq: é o nome do arquivo;
– modo: indica o tipo de abertura do arquivo;
– valor de retorno: um ponteiro para o arquivo.

8
Operação sobre arquivos - Abertura
• Modo de acesso:
Parâmetro Efeito
r Abre um arquivo-texto para leitura
w Cria um arquivo-texto para escrita
a Abre um arquivo-texto para gravar ao fim dele
r+ Abre um arquivo-texto para leitura/escrita
w+ Cria um arquivo-texto para leitura/escrita
a+ Abre ou cria (se não existir) um arquivo-texto para ler dele
ou gravar ao fim dele
rb Abre um arquivo binário para leitura
wb Cria um arquivo binário para escrita
ab Abre um arquivo binário para gravar ao m dele
r+b Abre um arquivo binário para leitura/escrita
w+b Cria um arquivo binário para leitura/escrita
a+b Abre ou cria um arquivo binário para gravar ao fim dele

Operação sobre arquivos - Abertura


• Exemplos:
1. // Declaracao de variaveis.
2. FILE *arq_ex1, *arq_ex2;
3.
4. // Abertura de arquivos.
5. arq_ex1 = fopen(“somente_escrita.txt”, “w”);
6. arq_ex2 = fopen(“leio_e_escrevo.meu”, “a+b”);

• O valor de retorno da função deve ser


validado!

9
Operação sobre arquivos - Abertura
• Validadação:
– O arquivo pode não existir ou pode não ser
aberto;
• Neste caso a função fopen() retornará NULL;
– Indicará que houve falha na abertura do arquivo.
• Exemplo:
1. // Declaracao de variaveis.
2. FILE *arq_ex3;
3.

4. // Abertura de arquivo.
5. arq_ex3 = fopen(“somente_escrita.txt”, “r”);
6.

7. if (arq_ex3 == NULL) {
8. printf(“Erro na abertura do arquivo! Finalizando programa...”);
9. exit (1);
10. }

Operação sobre arquivos - Fechamento


• Fechamento de arquivos:
– Quando não for mais utilizar o arquivo, ele deve
ser fechado;
• O fechamento desassocia o arquivo da variável usada.

• Em C, uso da função fclose();


– Protótipo:
1. int fclose(FILE *arq);
– Descrição:
– Retorno 0, indica sucesso no fechamento;
– Exemplo de uso:
1. fclose(arq_ex4);
– Para usar o arquivo, devemos abrí-lo novamente!

10
Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

Operações sobre arquivos texto - Leitura


• Existem uma série de funções, dentre elas:
• fscanf();
• fgets();

• São semelhantes ao uso das funções:


• scanf();
• gets();

• Protótipos das funções:


1. int fscanf(FILE *arq, const char *format, ...);
2.

3. char *fgets(char *str, int length, FILE *arq);

11
Operações sobre arquivos texto - Leitura
• Exemplo de uso do fscanf():
1. #include <stdio.h>
2.

3. int main (void) {


4. int inteiro;
5. float real;
6. char str[100];
7. FILE *arquivo;
8. arquivo = fopen(“nome_do_arquivo.txt”, “r”);
9. if (arquivo == NULL) {
10. printf(“Erro na abertura do arquivo!\n”);
11. exit (1);
12. } Atenção
13.
14. fscanf(arquivo, “%d\n%s\n%f”, &inteiro, str, &real);
15.
16. fclose(arquivo);
17. }

Operações sobre arquivos texto - Leitura


• Exemplo de uso do fgets():
1. #include <stdio.h>
2.

3. int main (void) {


4. char str1[100];
5. char str2[50];
6. FILE *arquivo;
7.
8. arquivo = fopen(“nome_do_arquivo.txt”, “r”);
9. if (arquivo == NULL) {
10. printf(“Erro na abertura do arquivo!\n”);
11. exit (1);
12. }
13.

14. fgets(str1, 100, arquivo);


15. fgets(str2, 50, arquivo);
16.

17. fclose(arquivo); Atenção


18. }

12
Operações sobre arquivos texto - Escrita
• Em C, usa se a função fprintf();

• Seu uso também é semelhante ao printf()!

• Seu protótipo:
1. int fprintf(FILE *arq, const char
*format, ...);

Operações sobre arquivos texto - Escrita


• Exemplo de uso do fprintf():
1. #include <stdio.h>
2. #define NOME_ARQUIVO “seu_arquivo.txt”
3. #define TAM_STR 50
4. int main (void) {
5. float real = 547.32; char caract = „T‟;
6. char str[TAM_STR] = “teste para string”;
7. FILE *arquivo;
8.

9. arquivo = fopen(NOME_ARQUIVO, “w”);


10. if (arquivo == NULL) {
11. printf(“Erro na abertura do arquivo!\n”);
12. exit (1);
13. }
14. fprintf(arquivo, “%f\n%c\n%s\n”, real, caract, str);
15. fprintf(arquivo, “Outra string – constante\n”);
16. fclose(arquivo);
17. }

13
Roteiro

• Lembrete!

• Introdução

• Tipos de arquivos

• Definição de arquivos

• Operação sobre arquivos

• Operações sobre arquivos texto

• Operações sobre arquivos binários

Operações sobre arquivos binários -


Leitura
• C possui a função fread();
• Protótipo:
1. size_t fread(void *buffer, size_t
num_bytes, size_t count, FILE *arq);
• Descrição:
– buffer: é um ponteiro para a região da memória
que receberá as variáveis lidas;
– num_bytes: número de bytes a serem lidos;
– count: quantas variáveis do tamanho
num_bytes serão lidas.
– variável de retorno: um inteiro sem sinal, indica
a quantidade de itens lidos.

14
Operações sobre arquivos binários -
Leitura
• Exemplo de uso do fread():

1. int inteiro;
2. float real;
3. char caract;
4.
5. /* ... */
6. fread(&inteiro, sizeof (int), 1, arquivo);
7. fread(&real, sizeof (float), 1, arquivo);
8. fread(&carac, sizeof (char), 1, arquivo);

Operações sobre arquivos binários -


Escrita
• C possui a função fwrite()
• Protótipo:
1. size_t fwrite(void *buffer, size_t
num_bytes, size_t count, FILE *arq);
• Descrição:
– buffer: é um ponteiro para a região da memória
que receberá as variáveis lidas;
– num_bytes: número de bytes a serem lidos;
– count: quantas variáveis do tamanho
num_bytes serão lidas;
– variável de retorno: um inteiro sem sinal, indica
a quantidade de itens lidos.

15
Operações sobre arquivos binários -
Escrita
• Exemplo de uso do fwrite():
1. typedef struct str_Pessoa {
2. char nome[50]; int idade; char sexo;
3. } tipo_Pessoa;
4. int main (void) {
5. FILE *arquivo;
6. tipo_Pessoa p;
7.

8. strcpy(p.nome, “um nome qualquer!”);


9. p.idade = 56;
10. p.sexo = „F‟;
11.

12. if ((arquivo = fopen(“nome_do_arquivo.bin”, “wb”)) == NULL) {


13. printf(“Erro na abertura do arquivo!\n”);
14. exit (1);
15. }
16. fwrite(&p, sizeof (tipo_Pessoa), 1, arquivo);
17. fclose(arquivo);
18. }

Operações sobre arquivos binários –


Leitura
• Exemplo de função que usa fread():
1. typedef struct str_Pessoa {
2. char nome[50]; int idade; char sexo;
3. } tipo_Pessoa;
4.

5. tipo_Pessoa le_Pessoa (char nomedoarquivo[100]) {


6. FILE *arquivo;
7. tipo_Pessoa p;
8.

9. if ((arquivo = fopen(nomedoarquivo, “rb”)) == NULL) {


10. printf(“Erro na abertura do arquivo!\n”);
11. exit (1);
12. }
13. fread(&p, sizeof (tipo_Pessoa), 1, arquivo);
14.

15. fclose(arquivo);
16.

17. return p;
18. }

16