15  Arquivos

15.1  O que é um arquivo?

Arquivo é uma coleção de dados armazenados em uma mídia apropriada (disco rígido, disquete, CD, fita, etc). Cada sistema operacional possui sua versão de gerenciador de arquivos, que podem ser de vários tipos (dados, texto, programa fonte, código-objeto, documento, etc) e que permite a sua manipulação (cópia, apagar, modificar, etc).

 

 

Figura 155‑1:

 Exemplo de gerenciador de arquivos

 

Para que um programa tenha um poder de ação mais amplo, é importante e conveniente poder muni-lo com mecanismos de armazenamento de resultados para uso posterior, bem como a capacidade de manuseio de grandes quantidades de informação.

Neste capítulo há uma série de exemplos ilustrativos de como o usuário pode gerar e usar arquivos.

15.2  Arquivo criado via programa

Na linguagem C/C++ a conexão e desconexão entre um programa e um arquivo pode ser feitas por meio das funções fopen() e fclose(), além do tipo de dados FILE. Seus protótipos e definições se encontram no arquivo header stdio.h, que deve ser declarado na instrução #include stdio.h. Esse tipo de dado, que tem forma de estrutura, atua como uma porta de acesso entre o programa e o arquivo de dados. Nele se encapsula toda a informação necessária para o programa e o sistema operacional, aquelas que controlam os recursos e mecanismos nos dispositivos de armazenamento, para acessar o arquivo associado.

Com os atuais recursos de compilação, é rara a ocasião na qual seja realmente necessário conhecer as informações relacionadas a esse tipo de dado. Normalmente se usa de forma transparente, associando origem e destino por funções a um determinado arquivo em um diretório de disco.

O compilador e o sistema operacional são os encarregados de acessar as informações do arquivo, usando o conteúdo do tipo de dados FILE, que aparece em geral  na forma de variável ponteiro.

A conexão inicial se efetua pela função fopen(), que é a encarregada de reservar memória para os dados, cada vez que são inicializados. A função retorna um ponteiro, que é guardado na variável que servirá de porta de acesso ao arquivo (também denominada de manipulador de arquivo).

A função fopen() recebe como parâmetros de entrada dois argumentos. O primeiro indica o nome e o caminho do arquivo (p.ex: “C:\temp\dados.txt”) enquanto o segundo indica o modo de conexão (“r” leitura, “w”escrita, “a” anexar em arquivo já existente, “+” leitura e escrita, “b” para arquivo binário).

O texto fonte abaixo irá criar um arquivo tipo texto em disco (Arquivo.txt) para escrita. Se um arquivo com o mesmo nome já existir no endereço ele será substituído!

//-----------------------------------------------------

#include <vcl\condefs.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <iostream.h>

#include <conio.h>

#pragma hdrstop

//-----------------------------------------------------

USERES("CriaArq.res");

//-----------------------------------------------------

int main(int argc, char **argv)

{

 FILE *ArqNovo = NULL;

 ArqNovo = fopen ("Arquivo.txt","w");

 if (ArqNovo==NULL)

  cout << "Erro ao abrir o arquivo para gravação\n";

else

  {

    cout << "Arquivo foi aberto para gravação\n";

    fprintf(ArqNovo,"Texto gravado em Arquivo.txt\n");

    fclose(ArqNovo);

  }

 cout << "Pressione uma tecla para terminar\n";

 getch();

 return 0;

}

//-----------------------------------------------------

O conteúdo do arquivo poderá ser verificado com um editor de texto qualquer.

 

Figura 155‑2:

conteúdo do arquivo gerado por programa

 

É importante notar que a função fclose() desconecta o arquivo da variável tipo ponteiro FILE que serve de porta de acesso ao arquivo em uso. A partir desse momento, o ponteiro para FILE não apontará para nenhuma informação válida, a menos que se atribua a ele o resultado de uma nova chamada fopen(). Isso pode ser feito explicitamente atribuindo-se NULL ao ponteiro.

Manter arquivos abertos desnecessariamente consome recursos do computador e pode ser uma fonte de problemas se os arquivos não forem fechados antes do término da execução do programa. Normalmente as informações podem se perder quando um programa termina de maneira anormal (desligar computador sem sair do programa), que é algo parecido como esquecer de executar a função fclose().