Trabalho com o sistema de arquivos em C++: do básico ao avançado
Trabalhar com o sistema de arquivos é uma das tarefas fundamentais no desenvolvimento em C++. Seja para salvar configurações de aplicativos, processar logs ou criar sistemas complexos de gerenciamento de dados — saber ler, escrever e manipular arquivos e diretórios é essencial para todo desenvolvedor C++. Neste artigo, abordaremos tanto os métodos clássicos de trabalho com arquivos através de fstream, quanto a abordagem moderna usando a biblioteca std::filesystem (C++17 e superior).
Fundamentos do trabalho com arquivos: biblioteca fstream
A biblioteca fstream (<fstream>) fornece três classes principais para trabalhar com arquivos:
ifstream— para leitura de arquivos (input file stream);ofstream— para escrita em arquivos (output file stream);fstream— para leitura e escrita simultâneas.
Leitura de dados de um arquivo
Vamos considerar um exemplo simples de abertura e leitura de um arquivo de texto linha por linha:
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("data.txt"); if (!inputFile.is_open()) { std::cerr << "Erro ao abrir o arquivo!" << std::endl; return 1; }
std::string line; while (std::getline(inputFile, line)) { std::cout << line << std::endl; }
inputFile.close(); return 0;}É importante sempre verificar se o arquivo foi aberto com sucesso usando o método is_open(). O arquivo será fechado automaticamente ao sair do escopo, mas chamar explicitamente close() é considerada uma boa prática.
Escrita de dados em um arquivo
A escrita em um arquivo é feita de forma análoga à saída no console — usando o operador <<:
#include <fstream>
int main() { std::ofstream outputFile("output.txt"); if (!outputFile) { std::cerr << "Não foi possível criar o arquivo!" << std::endl; return 1; }
outputFile << "Linha 1" << std::endl; outputFile << "Linha 2" << std::endl; outputFile << 42 << std::endl; // números são escritos automaticamente como texto
outputFile.close(); return 0;}Por padrão, ofstream sobrescreve o arquivo. Para adicionar dados ao final, use o flag std::ios::app:
std::ofstream outputFile("log.txt", std::ios::app);Arquivos binários e acesso aleatório
Para trabalhar com dados binários, use o flag std::ios::binary. Os métodos read() e write() permitem trabalhar com blocos de memória:
#include <fstream>
struct Record { int id; char name[50];};
int main() { // Escrita da estrutura Record rec = {1, "Exemplo"}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<char*>(&rec), sizeof(rec)); binOut.close();
// Leitura da estrutura Record recIn; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&recIn), sizeof(recIn)); binIn.close();
return 0;}Para posicionamento dentro do arquivo, use seekg() (para entrada) e seekp() (para saída) com os parâmetros std::ios::beg, std::ios::cur ou std::ios::end.
C++ moderno: biblioteca std::filesystem
A partir do C++17, o módulo std::filesystem foi incorporado à biblioteca padrão, simplificando significativamente o trabalho com o sistema de arquivos. Ele fornece funções convenientes para manipulação de caminhos, arquivos e diretó