Trabalhando com o sistema de arquivos em C++: um guia prático

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que trabalhar com o sistema de arquivos em C++ é fundamental

\n\n

Qualquer 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).

\n\n

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\n

1. Fundamentos: leitura e escrita de arquivos com fstream

\n\n

A 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.

\n\n

1.1. Escrevendo em um arquivo de texto

\n\n

A 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).

\n\n
#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\n

1.2. Lendo de um arquivo de texto

\n\n

Para leitura, usamos ifstream. A maneira mais confiável é ler linha por linha com std::getline.

\n\n
#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\n

1.3. Modos de abertura e arquivos binários

\n\n

Você 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().

\n\n
#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\n

2. Abordagem moderna: std::filesystem (C++17)

\n\n

A 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.

\n\n

2.1. Verificando a existência e obtendo informações sobre um arquivo

\n\n

Não mais

Blogs

Book Recommendations