C++ Básico Aula 16: Arquivos

 Imagem meramente ilustrativa

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:

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;

  4. int main ()
  5. {
  6.   ofstream meuarquivo("nome_do_arquivo.txt");
  7.   meuarquivo << "Gravando arquivos em C++\n";
  8.   meuarquivo.close();
  9.   return 0;
  10. }

    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:

Tela do GDB Online mostrando main.cpp
Tela do GDB Online mostrando main.cpp


Tela do GDB Online mostrando o novo arquivo criado
Tela do GDB Online mostrando o novo arquivo criado

    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:

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;

  4. int main ()
  5. {
  6.   ofstream meuarquivo("nome_do_arquivo.txt");
  7.   meuarquivo << "Sobrescrevendo arquivos em C++\n";
  8.   meuarquivo << "Repare que sumiu\n";
  9.   meuarquivo << "a frase do programa anterior\n";
  10.   meuarquivo.close();
  11.   return 0;
  12. }
Não esqueça de clicar em nome_do_arquivo.txt...
Não esqueça de clicar em nome_do_arquivo.txt...


... para ver a modificação
... 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:

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;

  4. int main (){
  5.   string variavel;
  6.   ofstream meuarquivo("nome_do_arquivo.txt");
  7.   meuarquivo << "Gravando arquivos em C++\n";
  8.   meuarquivo.close();
  9.   ifstream lendoarquivo("nome_do_arquivo.txt");
  10.   while (getline (lendoarquivo, variavel)) {
  11.     cout << variavel;
  12.   }
  13.   lendoarquivo.close();
  14.   return 0;
  15. }

    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
Tela do GDB Online mostrando o conteúdo do arquivo lido


    Na próxima aula abordaremos os tratamentos de Exceções.


Próxima Aula                                                                                                                        Aula Anterior

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.