Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.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
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:
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
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.
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.
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.
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:
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).
Como o registro lido no corresponde ao registro desejado, uma nova leitura ser necessria: cli.nconta = 7;
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.