Introdução
Em Sistemas Embarcados muitas vezes teremos um microcontrolador com seus sensores gerando leituras de dados que precisarão ser armazenadas. Para isso existem Bancos de Dados como o MySQL que com o auxílio de ferramentas como o Node-Red e o protocolo MQTT permitem o armazenamento de uma grande quantidade de informações em Servidores.
No entanto existirão situações onde o estudante precisará gravar arquivos de texto com preferências ou configurações de seus aplicativos. Pode ser em um cartão de memória micro SD ou mesmo na memória do dispositivo.
A finalidade dessa aula é dar uma introdução ao processo de gravação e leitura de arquivos texto com o C++, mas que não será necessariamente igual aos procedimentos comentados no parágrafo anterior, servindo nesse momento apenas para fins didáticos.
A Biblioteca fstream
A inclusão da biblioteca fstream nos programas permite a manipulação de arquivos através do uso de três classes:
- ofstream: Para criar e gravar em arquivos
- ifstream: Para ler arquivos
- fstream: Para criar, ler e gravar em arquivos
Criando e gravando arquivos
Diferente do processo de salvamento de arquivos que geralmente utilizamos nos aplicativos comerciais como Word, Excel, etc, a criação de arquivos através do fstream exige que o futuro arquivo seja aberto ou criado antes que alguma informação lhe seja passada.
Essa criação de arquivo é feita quando especificamos um nome único para um objeto de arquivo que recebe como parâmetro entre parênteses, um nome e uma extensão que o arquivo terá ao ser gravado.
As informações na forma de string podem ser passadas para o objeto arquivo através de um operador << de forma semelhante ao cout que já estamos acostumados. Ao final do processo o objeto arquivo deverá ser fechado para concluir a operação.
Vejamos um exemplo:
- #include <iostream>
- #include <fstream>
- using namespace std;
- int main ()
- {
- ofstream meuarquivo("nome_do_arquivo.txt");
- meuarquivo << "Gravando arquivos em C++\n";
- meuarquivo.close();
- return 0;
- }
Nesse exemplo estamos incluindo na linha 2 a biblioteca fstream. Repare que na linha 7 eu estou instanciando a partir da classe ofstream um objeto arquivo que eu chamei de meuarquivo e estou passando como parâmetro o nome_do_arquivo.txt que será criado.
Já na linha 8 eu estou apenas direcionando para o objeto arquivo um string que será gravada nele. O processo se encerra com o fechamento do objeto arquivo na linha 9 com o método close().
Se você copiar e colar esse código no GDB Online verá que ao rodá-lo com F9, a plataforma criará o arquivo em uma outra janela, de forma semelhante a que usamos ao comentar sobre bibliotecas. Ver figuras abaixo:
Cada vez que você rodar esse programa ele sobrescreverá o conteúdo do arquivo criado. Uma forma de comprovar isso e executar o código com a modificação abaixo. Não esqueça de clicar em main.cpp para abrir a janela de código:
- #include <iostream>
- #include <fstream>
- using namespace std;
- int main ()
- {
- ofstream meuarquivo("nome_do_arquivo.txt");
- meuarquivo << "Sobrescrevendo arquivos em C++\n";
- meuarquivo << "Repare que sumiu\n";
- meuarquivo << "a frase do programa anterior\n";
- meuarquivo.close();
- return 0;
- }
![]() |
... para ver a modificação |
Lendo arquivos
Para ler um arquivo de texto podemos fazer uso da classe ifstream. Para utilizá-la também é necessário abrir um arquivo de forma semelhante a que fizemos no exemplo anterior, isto é, através de um objeto de arquivo que recebe o nome do arquivo que será lido.
A leitura é feita por uma função chamada getline() que precisa percorrer o arquivo e colocar o seu conteúdo em uma variável string previamente declarada. Esse processo é feito na forma de um laço de repetição indefinido, por isso é feito por comando while. Feito isso a variável string armazenará o conteúdo do arquivo e poderá ser manipulada de diversas formas. Ao final o objeto arquivo deverá ser fechado com o método close().
A título de exemplo pegaremos o mesmo programa utilizado no primeiro exemplo e o adaptaremos para ler o arquivo criado e mostrá-lo na tela, isto é, na parte inferior do GDB Online. Para isso ele precisará criar o arquivo nome_do_arquivo.txt para depois ser lido.
Vejamos o exemplo:
- #include <iostream>
- #include <fstream>
- using namespace std;
- int main (){
- string variavel;
- ofstream meuarquivo("nome_do_arquivo.txt");
- meuarquivo << "Gravando arquivos em C++\n";
- meuarquivo.close();
- ifstream lendoarquivo("nome_do_arquivo.txt");
- while (getline (lendoarquivo, variavel)) {
- cout << variavel;
- }
- lendoarquivo.close();
- return 0;
- }
Nesse exemplo eu precisei declarar uma variável string na linha 6 para futuramente armazenar o conteúdo do arquivo. De resto o programa é igual ao primeiro até a linha 9. Já na linha 10 eu leio o arquivo que já existo com o auxílio de um nome objeto de arquivo que eu chamei de lendoarquivo().
Através de um laço na linha 11 e com a função getline() eu faço a varredura desse objeto de arquivo e jogo o conteúdo na variável. Depois é só mostrar o conteúdo da variável na tela na linha 12. Ao final o objeto é fechado na linha 14. O resultado é o que temos na imagem abaixo:
![]() |
Tela do GDB Online mostrando o conteúdo do arquivo lido |
Na próxima aula abordaremos os tratamentos de Exceções.
Referências
DEITEL, H. M. DEITEL, P. J. C++: Como programar. Pearson Education do Brasil. 2006.
GBDONLINE. Learn C++ Programming. Disponível em: <https://learn.onlinegdb.com/c%2B%2B_for_beginners> Acesso em 05 ago. 2024.
W3SCHOOLS. C++ Tutorial. Disponível em: <https://www.w3schools.com/cpp/default.asp> Acesso em 05 ago. 2024.