Introdução
Trabalhar com sistema de arquivos é uma das tarefas essenciais em qualquer programação aplicada. Em C++, existem duas abordagens principais: a clássica (usando a biblioteca <fstream>) e a moderna (usando a biblioteca <filesystem>, disponível a partir do padrão C++17). Neste artigo, vamos explorar na prática como ler e escrever arquivos, criar e excluir diretórios, além de verificar a existência de arquivos.
O material será útil tanto para iniciantes que estão aprendendo C++ quanto para desenvolvedores experientes que desejam atualizar seus conhecimentos sobre os recursos modernos da linguagem.
1. Leitura e escrita de arquivos de texto com fstream
A biblioteca <fstream> fornece classes para trabalhar com arquivos: ifstream (leitura), ofstream (escrita) e fstream (leitura e escrita).
1.1. Escrevendo dados em um arquivo
Para escrever em um arquivo, usamos um objeto ofstream. Se o arquivo não existir, ele será criado. Se existir, o conteúdo será sobrescrito (por padrão).
#include <iostream>#include <fstream>#include <string>
int main() { std::ofstream outFile("example.txt"); if (!outFile.is_open()) { std::cerr << "Erro ao abrir o arquivo!" << std::endl; return 1; }
outFile << "Olá, mundo!" << std::endl; outFile << "Esta é a segunda linha." << std::endl; outFile.close(); std::cout << "Dados escritos." << std::endl; return 0;}Observe: sempre verificamos se o arquivo foi aberto com sucesso e o fechamos após o uso.
1.2. Lendo dados de um arquivo
Para leitura, usamos ifstream. A maneira mais simples é ler linha por linha com std::getline.
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inFile("example.txt"); if (!inFile.is_open()) { std::cerr << "Erro ao abrir o arquivo!" << std::endl; return 1; }
std::string line; while (std::getline(inFile, line)) { std::cout << line << std::endl; } inFile.close(); return 0;}Este método é conveniente porque lida automaticamente com o final do arquivo e não requer verificações adicionais.
1.3. Modos de abertura de arquivo
Você pode combinar flags para controlar o modo de abertura. Por exemplo, para adicionar dados ao final do arquivo (modo append), use a flag std::ios::app:
std::ofstream outFile("example.txt", std::ios::app);outFile << "Linha adicional." << std::endl;outFile.close();Outras flags úteis: std::ios::binary (modo binário), std::ios::trunc (limpar o arquivo ao abrir).
2. Trabalho moderno com sistema de arquivos (C++17 e filesystem)
A biblioteca <filesystem> simplifica significativamente as manipulações com arquivos e pastas. Todas as funções estão no namespace std::filesystem.
2.1. Verificando a existência de um arquivo ou diretório
A função exists() retorna true se o objeto existir:
#include <iostream>#include <filesystem>
namespace fs = std::filesystem;
int main() { std::string path = "example.txt"; if (fs::exists(path)) { std::cout << "O arquivo existe." << std::endl; } else { std::cout << "Arquivo não encontrado." << std::endl; } return 0;}2.2. Criando e excluindo diretórios
Para criar uma pasta, use create_directory(). Para excluir, use remove() ou remove_all() (exclusão recursiva).