💻 Exemplos: Capítulo 15: I/O de Alta Performance, Streams e std::filesystem

Especialização em Sistemas com C++ • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar a manipulação de arquivos e sistema de diretórios com a biblioteca padronizada std::filesystem (C++17/C++20): criação e navegação de caminhos multiplataforma com std::filesystem::path, inspeção de arquivos, e persistência binária direta de alto desempenho através de std::ofstream e std::ifstream.


1. Código Fonte Completo (main.cpp)

/**
 * @file main.cpp
 * @brief Manipulação de sistema de arquivos com std::filesystem e I/O binário de alta performance.
 */

#include <iostream>
#include <fstream>
#include <filesystem>
#include <vector>
#include <cstdint>

namespace fs = std::filesystem;

#pragma pack(push, 1) // Garante alinhamento exato de 1 byte (sem padding) para gravação binária
struct HeaderBinario {
    char assinatura[4];  // "TELL"
    std::uint32_t versao;
    std::uint64_t timestamp;
    std::uint32_t num_amostras;
};
#pragma pack(pop)

int main() {
    std::cout << "=== CAPÍTULO 15: FILESYSTEM E I/O BINÁRIO EM C++20 ===" << '\n';

    // 1. Operações com std::filesystem
    fs::path dir_trabalho = fs::temp_directory_path() / "cpp_telemetria_lab";
    fs::path arquivo_dados = dir_trabalho / "dataset_sensores.bin";

    // Criação de diretório seguro
    if (!fs::exists(dir_trabalho)) {
        fs::create_directories(dir_trabalho);
        std::cout << "Diretorio criado: " << dir_trabalho.string() << '\n';
    }

    // 2. Gravação Binária de Baixo Nível (Fast Binary Dump)
    {
        HeaderBinario cabecalho = {
            {'T', 'E', 'L', 'L'},
            2,
            1774880000ULL,
            3
        };

        std::vector<float> amostras = { 12.5f, 25.0f, 37.5f };

        std::ofstream arquivo(arquivo_dados, std::ios::binary);
        if (!arquivo) {
            std::cerr << "Falha ao abrir arquivo para escrita!" << '\n';
            return 1;
        }

        // Escreve o cabeçalho
        arquivo.write(reinterpret_cast<const char*>(&cabecalho), sizeof(HeaderBinario));
        // Escreve o payload contíguo
        arquivo.write(reinterpret_cast<const char*>(amostras.data()), amostras.size() * sizeof(float));
        std::cout << "Dados binarios persistidos em: " << arquivo_dados.string() << '\n';
    }

    // 3. Inspeção de Metadados via Filesystem
    auto tamanho_bytes = fs::file_size(arquivo_dados);
    std::cout << "Tamanho fisico no disco: " << tamanho_bytes << " bytes." << '\n';

    // 4. Leitura Binária Direta
    {
        std::ifstream arquivo(arquivo_dados, std::ios::binary);
        if (!arquivo) {
            std::cerr << "Falha ao abrir arquivo para leitura!" << '\n';
            return 1;
        }

        HeaderBinario cabecalho_lido{};
        arquivo.read(reinterpret_cast<char*>(&cabecalho_lido), sizeof(HeaderBinario));

        std::cout << "\n--- Cabecalho Lido ---" << '\n';
        std::cout << "Assinatura: " << std::string(cabecalho_lido.assinatura, 4) << '\n';
        std::cout << "Versao:     " << cabecalho_lido.versao << '\n';
        std::cout << "Amostras:   " << cabecalho_lido.num_amostras << '\n';

        std::vector<float> amostras_lidas(cabecalho_lido.num_amostras);
        arquivo.read(reinterpret_cast<char*>(amostras_lidas.data()), amostras_lidas.size() * sizeof(float));

        std::cout << "Amostras recuperadas: ";
        for (float a : amostras_lidas) {
            std::cout << a << " ";
        }
        std::cout << '\n';
    }

    // 5. Limpeza do ambiente de teste
    fs::remove_all(dir_trabalho);
    std::cout << "\nDiretorio temporario removido com sucesso." << '\n';

    return 0;
}

2. Instruções de Compilação e Execução

# Compilação com GCC / Clang
g++ -std=c++20 -Wall -Wextra -O2 main.cpp -o app_filesystem
./app_filesystem

# Compilação com MSVC
cl /std:c++20 /EHsc /W4 /O2 main.cpp /Fe:app_filesystem.exe
.\app_filesystem.exe

3. Saída Esperada no Terminal

=== CAPÍTULO 15: FILESYSTEM E I/O BINÁRIO EM C++20 ===
Diretorio criado: /tmp/cpp_telemetria_lab
Dados binarios persistidos em: /tmp/cpp_telemetria_lab/dataset_sensores.bin
Tamanho fisico no disco: 32 bytes.

--- Cabecalho Lido ---
Assinatura: TELL
Versao:     2
Amostras:   3
Amostras recuperadas: 12.5 25 37.5 

Diretorio temporario removido com sucesso.