UFLA

🎓 Aula 13

Arquivos Binários e Arquivos Tipados

Prof. Paulo Rettore

Universidade Federal de Lavras

GAC124 — Introdução aos Algoritmos

🎯 Dados além da execução

Variáveis existem enquanto o programa está em execução. Arquivos permitem guardar dados de forma persistente.

Entrada

Ler dados já existentes.

Saída

Gravar dados para uso futuro.

Persistência

Os dados permanecem após fechar o programa.

📄 Texto, binário e tipado

TipoCaracterísticaExemplo
TextoLegível por pessoas.notas.txt
BinárioGrava bytes diretamente.dados.dat
TipadoRegistros de um tipo conhecido.Aluno em arquivo binário.

Arquivos binários são adequados quando o programa grava e lê estruturas com formato definido.

🔌 Abrindo um arquivo binário

#include <fstream>

ifstream entrada("alunos.dat", ios::binary);

if (!entrada) {
    cout << "Não foi possível abrir";
}

Sempre verifique se o arquivo foi aberto antes de tentar ler ou gravar dados.

✍️ Gravando um registro

struct Aluno {
    int matricula;
    double media;
};

Aluno a = {20260001, 82.5};
ofstream saida("alunos.dat", ios::binary);
saida.write(reinterpret_cast<char*>(&a), sizeof(Aluno));

Para gravação binária direta, use estruturas simples. Campos como string exigem uma estratégia própria de serialização.

📥 Lendo um registro

Aluno a;
ifstream entrada("alunos.dat", ios::binary);

entrada.read(reinterpret_cast<char*>(&a), sizeof(Aluno));

if (entrada) {
    cout << a.matricula << " " << a.media;
}

read() e write() usam a quantidade de bytes de cada registro.

🔁 Vários registros

Aluno a;
while (entrada.read(reinterpret_cast<char*>(&a),
                    sizeof(Aluno))) {
    cout << a.matricula << "\n";
}

O próprio retorno de read() informa se uma leitura completa ocorreu.

🧭 Posições no arquivo

Arquivos binários permitem acessar posições específicas quando os registros têm tamanho fixo.

long posicao = 2;
entrada.seekg(posicao * sizeof(Aluno), ios::beg);
entrada.read(reinterpret_cast<char*>(&a), sizeof(Aluno));

seekg() move a posição de leitura; seekp() move a posição de escrita.

🛡️ Cuidados importantes

  • Abra no modo correto: leitura, escrita e/ou ios::binary.
  • Verifique erros de abertura e leitura.
  • Feche o arquivo ao final — os objetos de stream também fecham ao sair de escopo.
  • Não grave diretamente estruturas com ponteiros ou string esperando que sejam reconstruídas automaticamente.

🧩 Prática em aula

Grave cinco registros Produto em um arquivo binário e depois leia o maior preço.

Gabarito orientador: Use uma struct com tipos simples, write() para gravar e read() em um laço para ler. Verifique abertura e leitura.

📚 Referências e materiais

Use estas fontes para consultas pontuais depois da aula:

Os slides completos, o Campus Virtual e o DREDD continuam sendo as fontes principais da disciplina.

📌 Resumo da aula

  • Arquivos mantêm dados depois que o programa termina.
  • read() e write() trabalham com bytes em arquivos binários.
  • Registros de tamanho fixo facilitam o acesso por posição.
  • É preciso validar abertura, leitura e formato dos dados.

PRÓXIMA AULA

⏭️ Próxima aula

Ordenação de vetores: métodos avançados

Prof. Paulo Rettore

GAC124 — Introdução aos Algoritmos