💻 Exemplos: Capítulo 15: I/O de Alta Performance, Streams e std::filesystem
💻 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.