0Pricing
C++ Academy · Aula

E/S de arquivos binários

Leia e escreva bytes brutos

E/S de arquivos binários é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Texto versus binário

O modo de texto escreve caracteres legíveis; o modo binário escreve os bytes brutos dos objetos exatamente como estão na memória. Abra o arquivo com std::ios::binary.

#include <iostream>
#include <fstream>

int main() {
    int value = 12345;
    std::ofstream out("v.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(&value), sizeof(value));
    std::cout << "wrote " << sizeof(value) << " bytes\n";
    return 0;
}

write aceita bytes

write(ptr, n) envia n bytes brutos de ptr. Você converte o endereço do objeto para const char*.

#include <iostream>
#include <fstream>

int main() {
    double d = 3.14;
    std::ofstream out("d.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(&d), sizeof(d));
    out.close();
    std::cout << "saved a double\n";
    return 0;
}

read restaura bytes

read(ptr, n) carrega n bytes no objeto localizado em ptr, revertendo uma escrita binária.

#include <iostream>
#include <fstream>

int main() {
    int original = 777;
    std::ofstream("i.bin", std::ios::binary).write(reinterpret_cast<const char*>(&original), sizeof(original));
    int loaded = 0;
    std::ifstream in("i.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(&loaded), sizeof(loaded));
    std::cout << loaded << '\n';
    return 0;
}

Escrevendo uma estrutura POD

Estruturas de dados simples (sem ponteiros e com membros de tamanho fixo) podem ser gravadas e recarregadas como um único bloco de bytes.

#include <iostream>
#include <fstream>

struct Record { int id; double balance; };

int main() {
    Record r{1, 99.5};
    std::ofstream out("rec.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(&r), sizeof(r));
    std::cout << "struct saved\n";
    return 0;
}

Lendo a estrutura de volta

A leitura restaura a estrutura inteira em uma única chamada de read.

#include <iostream>
#include <fstream>

struct Record { int id; double balance; };

int main() {
    Record w{42, 250.0};
    std::ofstream("r2.bin", std::ios::binary).write(reinterpret_cast<const char*>(&w), sizeof(w));
    Record r{};
    std::ifstream in("r2.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(&r), sizeof(r));
    std::cout << r.id << ' ' << r.balance << '\n';
    return 0;
}

Escrevendo uma matriz

Você pode escrever uma matriz inteira em uma única chamada, passando seu tamanho total em bytes.

#include <iostream>
#include <fstream>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    std::ofstream out("arr.bin", std::ios::binary);
    out.write(reinterpret_cast<const char*>(arr), sizeof(arr));
    std::cout << "wrote " << sizeof(arr) << " bytes\n";
    return 0;
}

Lendo a matriz de volta

Leia o mesmo número de bytes em uma matriz do mesmo tamanho.

#include <iostream>
#include <fstream>

int main() {
    int src[5] = {10, 20, 30, 40, 50};
    std::ofstream("a2.bin", std::ios::binary).write(reinterpret_cast<const char*>(src), sizeof(src));
    int dst[5] = {};
    std::ifstream in("a2.bin", std::ios::binary);
    in.read(reinterpret_cast<char*>(dst), sizeof(dst));
    for (int x : dst) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Buscando posições

seekg (obter) e seekp (inserir) movem a posição de leitura/escrita, permitindo acesso aleatório ao arquivo.

#include <iostream>
#include <fstream>

int main() {
    int data[3] = {100, 200, 300};
    std::ofstream("seek.bin", std::ios::binary).write(reinterpret_cast<const char*>(data), sizeof(data));
    std::ifstream in("seek.bin", std::ios::binary);
    in.seekg(sizeof(int)); // skip to second int
    int second; in.read(reinterpret_cast<char*>(&second), sizeof(second));
    std::cout << second << '\n';
    return 0;
}

Consultando a posição

tellg e tellp informam a posição atual, o que é útil para medir o tamanho do arquivo ou os deslocamentos.

#include <iostream>
#include <fstream>

int main() {
    int data[4] = {1, 2, 3, 4};
    std::ofstream("tell.bin", std::ios::binary).write(reinterpret_cast<const char*>(data), sizeof(data));
    std::ifstream in("tell.bin", std::ios::binary);
    in.seekg(0, std::ios::end);
    std::cout << "file size: " << in.tellg() << " bytes\n";
    return 0;
}

Por que não usar ponteiros

Nunca grave em binário objetos que contenham ponteiros ou std::string: você salvaria o endereço do ponteiro, não os dados para os quais ele aponta. Em vez disso, serialize o conteúdo.

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::string s = "hello";
    std::ofstream out("str.bin", std::ios::binary);
    std::size_t len = s.size();
    out.write(reinterpret_cast<const char*>(&len), sizeof(len));
    out.write(s.data(), len); // write the chars, not the object
    std::cout << "serialized " << len << " chars\n";
    return 0;
}

Ressalvas de portabilidade

Os layouts binários dependem da ordenação dos bytes e do tamanho dos tipos. Arquivos escritos em uma plataforma podem não ser lidos corretamente em outra; por isso, defina um formato fixo para compartilhá-los.

#include <iostream>
#include <cstdint>

int main() {
    std::int32_t fixed = 1; // fixed-width type for portability
    std::cout << "sizeof int32_t = " << sizeof(fixed) << '\n';
    return 0;
}

Verificação rápida

Teste sua compreensão sobre E/S binária.

Recapitulação

Você aprendeu E/S de arquivos binários:

  • abra com std::ios::binary; use write/read com reinterpret_cast<char*>
  • seekg/seekp e tellg/tellp fornecem acesso aleatório
  • nunca grave ponteiros ou strings diretamente; serialize seu conteúdo e tenha cuidado com a ordenação dos bytes

Em seguida, você aprenderá a verificar o estado do fluxo e lidar com erros.

Perguntas Frequentes

A aula “E/S de arquivos binários” é grátis?

Sim — o texto completo de “E/S de arquivos binários” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “E/S de arquivos binários”?

Leia e escreva bytes brutos Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “E/S de arquivos binários”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Leitura de arquivos com ifstream
  2. Escrita de arquivos com ofstream
  3. E/S de arquivos binários
  4. Tratamento de erros e estado
← Voltar para C++ Academy