Sie sind auf Seite 1von 10

FATEC Faculdade de Tecnologia de Sorocaba

LP Linguagem de Programao I
Manipulao de Arquivos
A palavra arquivo ser usada para indicar fluxo de bytes. Todo lugar que tem capacidade para receber bytes da memria do computador ou transferi-los para ela recebe o nome de arquivo. Em C, podemos trabalhar com arquivos por meio de acesso em alto-nvel ou em baixo-nvel. O conjunto de funes que interagem com arquivos em alto-nvel so bufferizadas, isto , mantm uma rea de memria para manipular os bytes antes de serem gravados ou para manipular bytes lidos antes de serem enviados ao programa. As funes de acesso de baixo-nvel no so bufferizadas. Os arquivos podem ser textuais (que armazenam informaes codificadas como caracteres ASCII) ou Binrio (arquivos que armazenam informao codificada em binrio).

1. Leitura e gravao e alto-nvel


As informaes especficas sobre um arquivo devem estar presentes antes que um programa possa acess-lo, ou seja, o sistema operacional deve trabalhar conjuntamente com o programa. Em C, as informaes necessrias so guardadas em uma estrutura do tipo FILE. A definio dessa estrutura est contida no arquivo stdio.h. Um fragmento de stdio.h #define FOPEN_MAX 20 -> numero maximo de arquivos abertos simultaneamente em um programa struct _iobuf { char *_ptr; int _cnt; char *base; int _flag; int _file; int _charbuf; int _bufsiz char *_tmpfname; } typedef struct _iobuf FILE; Como cada arquivo necessita de informaes similares, stdio.h declara uma matriz de estruturas FILE. A constante FOPEN_MAX determina a dimenso da matriz e representa o nmero mximo de arquivos que podem ser abertos simultaneamente por um programa. O nmero FOPEN_MAX depende das consideraes tomadas no projeto do compilador e das restries do sistema operacional. Os membros da estrutura FILE contm informaes do arquivo, tais como: seu atual tamanho, localizao de seus buffers de dados, se o arquivo est sendo lido ou gravado, etc. O programador no deve se preocupar com o contedo dos membros da estrutura FILE, e sim voltar seu interesse para a abertura de um arquivo e como trabalhar com ele.

FATEC Faculdade de Tecnologia de Sorocaba

1.1 Arquivos Textuais


Vantagens: - Facilidade de criar um arquivo textual: utilizar qualquer editor de texto. - A versatilidade de verificar o contedo, pois as informaes esto codificadas como caracteres. Desvantagens: - A codificao do contedo do arquivo consome 1 byte por caractere, o que pode inviabilizar a utilizao do arquivo para grande volumes de dados. - O processamento do arquivo lento, pois as informaes codificadas em ASCII devem ser convertidas para binrio para serem armazenadas na memria do computador. - A versatilidade de verificar o contedo pode ser uma desvantagem, dependendo do sigilo das informaes.

1.1.1 Abrindo Arquivos com fopen() cria e preenche uma estrutura FILE com as informaes necessrias para o programa e o sistema operacional, de maneira que possam se comunicar. Em seguida, retorna um ponteiro do tipo FILE que aponta para a localizao da memria dessa estrutura criada.
Exemplo: A funo fopen() executa duas tarefas. Em primeiro lugar,

arq = fopen("dados32.txt","r");
Como aberto o arquivo Programa.c Nome do arquivo Ler, gravar, etc Ponteiro para File Sistema Operacional

Disco

FATEC Faculdade de Tecnologia de Sorocaba

Modos de abertura:

Modo r

Significado Abre um arquivo existente para leitura de dados; se o arquivo no existir, ir ocorrer um erro. Abre um novo arquivo para gravao de dados; se o arquivo j existir, a gravao ir sobrescrever os dados existentes. Abre um arquivo para operaes de anexao de dados; se o arquivo no existir, ser criado um novo arquivo.

Para trabalhar com arquivos em alto-nvel, a linguagem C oferece um pacote de funes de biblioteca, que veremos a seguir:

1.1.2 Fechando arquivo com fclose()


Fechar um arquivo significa, em primeiro lugar, esvaziar seu buffer, gravando nele os caracteres remanescentes. Outra funo que fecha arquivos exit(). Ela difere da funo fclose() em vrios pontos. Primeiro, exit() fecha todos os arquivos abertos. Segundo, encerra o programa e devolve o controle ao sistema operacional.

A funo fclose() simplesmente fecha o arquivo associado ao ponteiro FILE enviado como argumento. 1.1.3 A funo EOF() Essa funo retorna verdadeiro se o final de arquivo tiver sido atingido; caso contrrio retorna falso

Fim de Arquivo e a contante EOF

O que EOF? importante entender que EOF no um caracter pertencente ao arquivo e sim uma constante, do tipo short int, definida no arquivo stdio.h com o valor 0xFFFF ou -1. O fim de arquivo reconhecido pelo sistema operacional, o Windows envia 0xFFFF aos nossos programas para avisar que o arquivo acabou. Obs.: A marca de fim de arquivo pode ser diferente para diferentes sistemas operacionais. Assim, o valor de EOF pode ser qualquer. O seu arquivo stdio.h define EOF com o valor correto para seu sistema operacional; assim, em seus programas, use EOF para testar fim de arquivo. O uso de um nmero, por exemplo, -1, em vez de EOF, pode causar problemas se o programa for transportado para outro sistema operacional.

FATEC Faculdade de Tecnologia de Sorocaba

1.1.4 As funes fputc() e fgetc()


As funes fputc() e fgetc() gravam e lem os dados linha a linha (como strings).

1.1.5 As funes fprintf() e fscanf() As funes fpritf() e fscanf() gravam ou lem os dados de modo formatado.
Dispositivos de entrada e sada de dados tambm so reconhecidos pela linguagem C. Os dispositivos padres so estabelecidos por constantes predefinidas, conforme mostra a tabela a seguir: Constante stdin stdout stderr stdaux stdprn Significado Dispositivo padro de entrada Dispositivo padro de sada Dispositivo padro de erro Dispositivo padro auxiliar Dispositivo padro de impresso Dispositivo Teclado Vdeo Vdeo Porta Serial Porta Paralela

As funes fscanf e fprintf so generalizaes das funes scanf e printf, podendo ser usadas para quaisquer tipos de arquivos. J as funes scanf e printf s podem ser usadas para os dispositivos padres (stdin e stdout).

Ateno!

Quando se usa fscanf para ler informaes numricas em um arquivo, os dados devem estar separados uns dos outros por, pelo menos, um espao em branco. O espao em branco considerado como um delimitador para dados numricos.
Mas e quando um arquivo contm dados no numricos como, por exemplo, Sao Paulo? Neste caso, preciso usar outra forma de leitura, pois os espaos podem fazer parte do prprio dado.

Quando um arquivo contm informaes no numricas, a leitura dos dados deve ser feita do seguinte modo: - ler toda a linha do arquivo como um string; - Extrair do arquivo lido substrings que correspondam aos dados; - converter cada substring para o tipo de dados correspondente.

FATEC Faculdade de Tecnologia de Sorocaba

1.1.6 fgets()
A funo fgets() permite ler toda uma linha de um arquivo como um string. Recebe trs argumentos: o ponteiro char para a cadeia de caracteres em que os dados lidos do arquivo sero colocados, o nmero mximo de caracteres a serem lidos, e o ponteiro para a estrutura FILE do arquivo. Retorna um ponteiro para a cadeia de caracteres lida ou NULL se encontrar algum erro ou fim de arquivo.

char fgets(char string, int limite, FILE *ponteiro_arquivo);

FATEC Faculdade de Tecnologia de Sorocaba

1.2 Arquivos Binrios


interessante para o tratamento de grande volumes de dados que precisam sofrer alteraes frequentemente.

1.2.1 Abertura de arquivos


Na abertura de arquivos binrios, o segundo parmetro da funo fopen deve especificar, alm da utilizao do arquivo, a forma binria de codificao de informaes. O string b deve ser concatenado ao modo de abertura: Modo r + b w + b a + b Significado Abre um arquivo binrio existente para leitura e gravao de dados; se o arquivo existir, ir ocorrer um erro. Abre um novo arquivo binrio para leitura e gravao de dados; se o arquivo j existir, a gravao ir sobrescrever os dados existentes. Abre um arquivo binrio para atualizao de dados; se o arquivo no existir, ser criado um novo arquivo.

Em arquivos binrios, os registros devem ser definidos por uma estrutura de dados conveniente.

Portanto, cada registro do arquivo ir corresponder a 32 bytes. Ou seja, sizeof(cliente) = 32. Podemos representar cada registro do arquivo como:

O arquivo binrio inteiro pode ser visto de forma esquemtica como um conjunto de registros de 32 bytes:

FATEC Faculdade de Tecnologia de Sorocaba

1.1.1 Operaes de leitura e escrita


As operaes de leitura e escrita em arquivos binrios so realizadas, respectivamente, pelas funes fread e fwrite. Essas funes requerem os seguintes parmetros: - Endereo de memria para onde a informao ser lida (ou o endereo de memria de onde provm a informao a ser escrita); - Tamanho (em bytes) do bloco de memria a ser lido ou escrito; - Nmero de blocos de memria a serem acessados (lidos ou escritos); - A identificao do arquivo. As funes fread e fwrite so chamadas para acessar apenas um registro. Exemplo: fread(&cli,sizeof(cliente),1,arq); Nesta chamada temos os seguintes parmetros: &cli: endereo da varivel cli (tipo cliente); sizeof(cliente): quantidade de bytes do bloco de memria (registro) a ser lido; 1: indica o acesso a apenas um bloco de memria (1 registro) do arquivo; arq: ponteiro para o arquivo.

FATEC Faculdade de Tecnologia de Sorocaba

Observe agora a leitura simultnea de mltiplos blocos de memria

O acesso aos registros de um arquivo feito, normalmente, de forma seqencial. A estrutura FILE armazena um ponteiro para a posio atual no arquivo. Podemos imaginar que o ponteiro para a posio atual identifica o registro a ser acessado. Na abertura do arquivo, este ponteiro posicionado no incio do primeiro registro:

Cada acesso (de leitura ou de gravao) desloca este ponteiro para frente de um valor correspondente quantidade de bytes acessados. Quando o ponteiro estiver alm do ltimo registro, a funo feof retorna 1 (fim do arquivo).

Acesso aos registros: Inicialmente, tem-se:

Aps a leitura do primeiro registro, teremos: cli.nconta = 3;

FATEC Faculdade de Tecnologia de Sorocaba

Como o registro lido no corresponde ao registro desejado, uma nova leitura ser necessria: cli.nconta = 7;

Novamente, ser necessrio uma nova leitura: cli.nconta = 5;

Agora, o registro desejado foi encontrado (cli.nconta = 5) , mas o ponteiro est posicionado no incio do prximo registro. Para posicionar de volta o ponteiro no incio do registro desejado, a funo encontra_registro usa: fseek(arq,-sizeof(cliente),SEEK_CUR); A funo fseek usada para posicionar o ponteiro de acesso aos registros em uma posio qualquer da seqncia de bytes que constitui o arquivo. Os parmetros desta funo so: Identificao do arquivo; Valor do deslocamento em bytes do ponteiro de acesso aos registros (+: para frente, -: para trs); Posio a partir da qual ser feito o deslocamento. As seguintes constantes so usadas para identificar esta posio: SEEK_SET indica o incio do arquivo; SEEK_CUR indica a posio atual do ponteiro; SEEK_END indica o final do arquivo. fseek(arq,-sizeof(cliente),SEEK_CUR);

Neste caso, ser realizado um deslocamento para trs, correspondente ao tamanho de um registro, em relao posio atual do ponteiro.

FATEC Faculdade de Tecnologia de Sorocaba Note que, se o nmero da conta correspondesse exatamente ao nmero do registro, o ponteiro poderia ser posicionado como a seguir: fseek(arq,(n-1)*sizeof(cliente),SEEK_SET); Neste caso, n o nmero do registro. Por exemplo, para n=3, precisamos de 2 deslocamentos para frente, a partir do incio do arquivo.

Bibliografia
Mizrahi, Victorine Viviane. Treinamento em Linguagem C. So Paulo: Editora Pearson, 2008, 2 edio. Schildt, Hebert. C completo e Total. So Paulo: Makron Books, 1996. Senne, Edson Luiz Frana. Primeiro Curso de Programao em C. Florianpolis: Editora Visual Books, 2009, 3a edio.