Introdução: por que trabalhar com o sistema de arquivos em C++ é fundamental
\n\nQualquer programa sério, mais cedo ou mais tarde, enfrenta a necessidade de salvar dados no disco ou lê-los de lá. Arquivos de configuração, logs, bancos de dados, documentos do usuário — tudo isso requer a capacidade de interagir com o sistema de arquivos. Em C++, existem duas abordagens principais para isso: os fluxos clássicos de entrada/saída (biblioteca <fstream>) e o mais moderno e de alto nível std::filesystem (a partir de C++17).
Neste artigo, abordaremos cenários práticos: desde a simples leitura e escrita de arquivos de texto até a navegação por diretórios e tratamento de erros. Todos os exemplos são escritos em C++17/20 e estão prontos para uso em seus projetos.
\n\n1. Fundamentos: leitura e escrita de arquivos com fstream
\n\nA biblioteca <fstream> fornece três classes principais: ifstream (fluxo de entrada — leitura), ofstream (fluxo de saída — escrita) e fstream (fluxo bidirecional). Vamos analisá-las com exemplos.
1.1. Escrevendo em um arquivo de texto
\n\nA maneira mais simples de gravar dados é usar ofstream. Se o arquivo não existir, ele será criado. Se existir, será sobrescrito (modo ios::trunc por padrão).
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ofstream outFile("example.txt");\n if (!outFile) {\n std::cerr << "Erro ao abrir o arquivo para escrita\\n";\n return 1;\n }\n\n outFile << "Olá, sistema de arquivos C++!\\n";\n outFile << "Linha número 2\\n";\n outFile << 42 << " — é um número.\\n";\n\n outFile.close(); // fechar manualmente não é obrigatório, mas é uma boa prática\n std::cout << "Dados gravados.\\n";\n return 0;\n}\n\n1.2. Lendo de um arquivo de texto
\n\nPara leitura, usamos ifstream. A maneira mais confiável é ler linha por linha com std::getline.
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ifstream inFile("example.txt");\n if (!inFile) {\n std::cerr << "Arquivo não encontrado ou não pode ser aberto\\n";\n return 1;\n }\n\n std::string line;\n while (std::getline(inFile, line)) {\n std::cout << "Lido: " << line << '\\n';\n }\n\n inFile.close();\n return 0;\n}\n\n1.3. Modos de abertura e arquivos binários
\n\nVocê pode combinar flags de abertura: ios::app (anexar), ios::binary (modo binário), ios::ate (ir para o final). Para arquivos binários, use os métodos read() e write().
#include <fstream>\n#include <vector>\n\n// Exemplo: gravação e leitura de um vetor de números em formato binário\nvoid saveVector(const std::string& filename, const std::vector<int>& data) {\n std::ofstream file(filename, std::ios::binary);\n if (!file) return;\n file.write(reinterpret_cast<const char*>(data.data()), data.size() * sizeof(int));\n}\n\nstd::vector<int> loadVector(const std::string& filename) {\n std::ifstream file(filename, std::ios::binary);\n if (!file) return {};\n file.seekg(0, std::ios::end);\n size_t size = file.tellg() / sizeof(int);\n file.seekg(0, std::ios::beg);\n std::vector<int> data(size);\n file.read(reinterpret_cast<char*>(data.data()), size * sizeof(int));\n return data;\n}\n\n2. Abordagem moderna: std::filesystem (C++17)
\n\nA partir de C++17, a biblioteca padrão incluiu o módulo <filesystem>, que permite trabalhar com caminhos, arquivos e diretórios em alto nível, de forma multiplataforma.
2.1. Verificando a existência e obtendo informações sobre um arquivo
\n\nNão mais