Arquivos em C++: do iniciante ao profissional em 20 minutos
\n\nImagine que seu programa é um excelente chef. Ele sabe cozinhar, mas todos os ingredientes precisam ser trazidos manualmente, e as receitas desaparecem após cada uso. Não parece muito bom, certo? É por isso que qualquer desenvolvedor que se preze deve saber trabalhar com arquivos e o sistema de arquivos. Em C++, isso não é apenas "possível" — é a base, sem a qual você, como programador, se sentirá inseguro.
\n\nHoje vamos abordar o trabalho com arquivos em C++ para que você não apenas copie o código, mas realmente entenda o que acontece nos bastidores. Sem palestras chatas, com exemplos vivos e dicas práticas. Vamos lá!
\n\nFluxos — a base do trabalho com arquivos em C++
\n\nEm C++, o trabalho com arquivos é construído em torno de fluxos. Se você já conhece cout e cin, considere que metade do caminho está percorrida. Os fluxos de arquivo funcionam com o mesmo princípio, só que, em vez da tela ou do teclado, os dados são enviados para um arquivo ou carregados dele.
Os principais jogadores em campo:
\n\n- \n
ifstream— para leitura de arquivo (input file stream). \n ofstream— para escrita em arquivo (output file stream). \n fstream— fluxo universal para leitura e escrita. \n
Todas essas classes vivem no arquivo de cabeçalho <fstream>. Não esqueça de incluí-lo, senão o compilador ficará chateado com você.
Como abrir um arquivo e não enlouquecer
\n\nAbrir um arquivo em C++ é como abrir uma porta: você precisa saber para onde ir e por quê. Vamos ver um exemplo simples de abertura de arquivo para escrita:
\n\n#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ofstream outFile("example.txt"); // Abre o arquivo para escrita\n \n if (outFile.is_open()) {\n outFile << "Olá, arquivo!" << std::endl;\n outFile << "Esta é a segunda linha." << std::endl;\n outFile.close(); // Fecha o arquivo\n std::cout << "Escrita realizada com sucesso!" << std::endl;\n } else {\n std::cerr << "Não foi possível abrir o arquivo!" << std::endl;\n }\n \n return 0;\n}\n\n\nObserve: sempre verificamos se o arquivo foi aberto usando is_open(). Se o arquivo não existir, ofstream o criará automaticamente. E se não for possível (por exemplo, sem permissão de escrita), o programa não falhará, mas informará o erro.
Modos de abertura: quando um só não basta
\n\nPor padrão, ofstream sobrescreve o arquivo, e ifstream apenas lê. Mas e se você quiser adicionar dados ao final do arquivo? Ou abrir o arquivo para leitura e escrita simultaneamente? É aí que entram as flags de modo:
- \n
std::ios::in— abrir para leitura. \n std::ios::out— abrir para escrita (padrão para ofstream). \n std::ios::app— anexar ao final do arquivo (append). \n std::ios::ate— mover o cursor para o final ao abrir. \n std::ios::binary— abrir em modo binário. \n
Exemplo de uso de modos:
\n\nstd::ofstream logFile("log.txt", std::ios::app); // Anexa ao final\nif (logFile.is_open()) {\n logFile << "Nova entrada no log" << std::endl;\n logFile.close();\n}\n\n\nE se precisar ler e escrever — use fstream com flags combinadas:
std::fstream file("data.txt", std::ios::in | std::ios::out);\n\n\nLeitura de arquivo: por palavras e por linhas
\n\nLer de um arquivo em C++ é uma arte à parte. Pode-se ler por palavras, por linhas, por caracteres. A escolha depende da tarefa.
\n\nLeitura por linhas (a maneira mais popular)
\n\n#include <fstream>\n#include <iostream>\n#include <string>\n\nint main() {\n std::