Baixe o app para aproveitar ainda mais
Prévia do material em texto
Disciplina: Linguagem de Programação I Aula 10: Arquivos – armazenando para preservar (2ª Parte) Introdução Escolher usar arquivo binário é uma decisão do programador, mas há momentos que deixa de ser escolha pelas necessidades impostas pela aplicação. Na Aula 9, tivemos a oportunidade de construir arquivos externos, usando o bloco de notas, mas, no modo binário, isso não é possível, pois não existe o conceito de linha, uma vez que o arquivo binário é uma sequência de bytes que não têm significado se tentarmos ler o arquivo. Nesta aula, conheceremos muitas funções que lhe darão subsídios para explorar ao máximo as vantagens que temos ao usar arquivo binário. Mantivemos a linha de apresentar soluções padrão ANSI, evitando, quando possível, o uso de funções que não estão disponíveis em alguns compiladores. Além das funções de abertura e fechamento já estudadas, vamos aprender outras que irão permitir obter a posição dentro do arquivo de um elemento/estrutura ou posicionar em um local especifico dentro do arquivo, possibilitando acesso direto. Objetivos Reconhecer as vantagens do arquivo binário; Reconhecer e usar as funções rewind(), fread(), fwrite(), fgetpos(), fsetpos(), fseek(), ftell(), rename(), remove(), rewind(); Construir trechos de gravação leitura, consulta, alteração e exclusão em arquivos no modo binário. Funções de leitura e gravação � Função: fread () Essa função lê um elemento (variável simples, struct ou matriz) do arquivo externo e armazena na MP, cujo endereço está indicado no primeiro parâmetro. Protótipo int fread (void * ptr, size_t tamanho, size_t nmemb, FILE* ptrArq); Sintaxe fread (enderecoElemento, tamanho, quantidade, ptrArq); Exemplo Para mais esclarecimentos quanto aos argumentos tamanho e quantidade, veja um exemplo. <galeria/aula10/anexo/a10_doc01.pdf> � Função: fwrite () file:///W:/2018.2/linguagem_de_programacao_i__conv010/galeria/aula10/anexo/a10_doc01.pdf Essa função copia um elemento cujo endereço está indicado no primeiro parâmetro (variável simples, struct ou matriz) da MP e grava no arquivo externo, avançando o indicador de fluxo tantos bytes quantos forem os especificados na função. Protótipo int fwrite (void * ptr, size_t tamanho, size_t nmemb, FILE* ptrArq); Sintaxe int fwrite (enderecoElemento, tamanho, quantidade, ptrArq); Exemplo Vários exemplos dessa função apresentam trechos muito grandes e, por essa razão, disponibilizaremos cada trecho em um programa para facilitar o entendimento. Apresentamos também programas que funcionam através de menu. Veja os exemplos. <galeria/aula10/anexo/a10_doc02.pdf> Veja o significado de cada parâmetro da função: enderecoElemento É um ponteiro para qualquer tipo que localiza a posição na MP onde deverá ser armazenado o elemento que foi lido do arquivo externo. Em outras palavras, o nome do elemento que, dependendo do tipo, tem & precedendo o nome para se tornar um endereço. Tamanho Número de bytes do que vai ser lido, fornecido pela função sizeof (argumento), sendo o argumento o tipo do elemento, ou o nome do elemento. file:///W:/2018.2/linguagem_de_programacao_i__conv010/galeria/aula10/anexo/a10_doc02.pdf Quantidade Indica o total de itens lidos, onde cada item possui seu tamanho especificado no parâmetro tamanho. ptrArq Variável ponteiro de arquivo que aponta para o arquivo externo. Lembre-se que duas pequenas alterações deverão ser realizadas para “rodar” nossos programas no Linux: Trocar system(“cls”); por system(“clear”); Retirar: system(“pause”); Funções de localização e posicionamento � Função: ftell () Essa função tem como finalidade retornar a posição corrente no fluxo expressa sob o número de bytes a partir do início para arquivo binário, sendo do tipo long int. Lembrando que a primeira posição é 0 e, por essa razão, tem a coincidência entre número de bytes e a posição para arquivo binário. Geralmente é usada para arquivo de modo binário, mas nada impede de usá-la em arquivo no modo texto. Para arquivo texto, retorna a posição do início de uma linha, mas assumindo que \n pode ser considerado como dois caracteres, não podemos confundir o número que aparece com o tamanho do arquivo. Sendo assim, uma das aplicações para esse tipo de arquivo seria retornar a uma posição desde que fosse armazenado o retorno da função em uma variável. Protótipo long int ftell (FILE * ptrArq); Sintaxe ftell (variavelPonteiroArquivo); Como toda função que tem retorno, a ftell deverá ser usada como argumento de outra função ou ter seu valor armazenado em uma variável para que possa ser usado em outro momento. O retorno dessa função poderá ser a posição atual do ponteiro de leitura/gravação ou -1L em caso de erro. Lembre-se que esse retorno é do tipo long int. Exemplo Antes de dar continuidade a seus estudos, veja um exemplo <galeria/aula10/anexo/a10_doc03.pdf> para entender melhor o conteúdo. file:///W:/2018.2/linguagem_de_programacao_i__conv010/galeria/aula10/anexo/a10_doc03.pdf Função: fseek () Essa função desloca o indicador de posição de arquivo, apontado por stream, para uma posição que é obtida pelo acréscimo, ou decréscimo, de bytes cujo valor se encontra em offset, à posição indicada por whence. Protótipo int fseek (FILE *ptrArq, long offset, int whence); Sintaxe fseek (variavelPonteiroArquivo, deslocamento, origem); seek_set seek_cur seek_end Vamos entender cada parâmetro: Variável ponteiro de arquivo Identifica o fluxo, isto é, o nome da variável ponteiro do tipo file. Deslocamento Para arquivo do tipo binário, o número de bytes que deverá ser deslocado a partir da origem. Caso esse valor seja negativo, retrocede, indo em direção ao início, mas, se positivo, avança em direção ao fim do arquivo. Para arquivos do tipo texto, esse parâmetro é 0L (constante do tipo long) ou o retorno da função, ftell() podendo ser combinado com uma operação para chegar em uma determinada linha, sendo necessário um cuidado especial, visto que o número de caracteres de cada linha é variável. Origem Posição de referência para o deslocamento. Só três valores poderão ser usados. São as constantes abaixo: Constante Valor Posição SEEK_SET 0 Início SEEK_CUR 1 Atual SEEK_END 2 Fim Como a função é do tipo int, significa que tem retorno. Se a ação for bem sucedida, retorna 0 caso contrário, retorna –1. Simplificando, o objetivo é fazer um reposicionamento do indicador de fluxo. Função: rewind () Essa função seta o indicador de posição do arquivo no início. Protótipo Void rewind(FILE *ptrArq); Sintaxe rewind (variavelPonteiroArquivo); É uma função sem retorno (tipo void). Ela é equivalente à função fseek(), com deslocamento 0 e posição de referência SEEK_SET, além de limpar o indicador de erro do fluxo. rewind (variavelPonteiroArquivo); � fseek(variavelPonteiroArquivo, 0, SEEK_SET); Exemplo Veja dois exemplos <galeria/aula10/anexo/a10_doc04.pdf> para entender melhor o conteúdo. Funções fgetpos e fsetpos As funções que estudaremos agora são equivalentes às funções fseek() e ftell() vistas anteriormente. file:///W:/2018.2/linguagem_de_programacao_i__conv010/galeria/aula10/anexo/a10_doc04.pdf As funções fgetpos e fsetpos são interfaces alternativas equivalentes a ftell e fseek (com whence setado para SEEK_SET), configurando e armazenando o valor corrente do offset do arquivo do objeto referenciado por pos. Em alguns sistemas não UNIX, um objeto fpos_t pode ser um objeto complexo e estas rotinas podem ser a única maneira portável de reposicionar um fluxo de texto. Manual do Programador Linux Saiba mais Veja dois Manual do Programador Linux <http://renesp.com.br/man/man3/fseek.3.html> . Para que possamos usar essas funções, precisamos conhecer um tipo pré- definido: fpos_t http://renesp.com.br/man/man3/fseek.3.html É um tipo pré-definido da biblioteca stdio.h que declara objeto armazenando informações, que possibilitam especificar uma posição qualquer dentro de um arquivo. Essas informações são recebidas da função fgetpos()e usadas pela função fsetpos(). Função: fgetpos() Obtém a posição atual no fluxo, armazenando-a no objeto apontado por pos. Protótipo int fgetpos(FILE *ptrArq, fpos_t *pos); Sintaxe fgetpos (variavelPonteiroArquivo, &pos); O retorno dessa função é 0 se bem sucedida e a, se não for. Tanto essa função como a função ftell() obtém a posição corrente. Logo, são equivalentes. fgetpos (variavelPonteiroArquivo, &pos); � pos = ftell (variavelPonteiroArquivo); � Função: fsetpos() Ajusta o indicador de posição de arquivo para o lugar sinalizado na variável pos e cujo valor pode ter sido recebido através da função fgetpos() ou da função ftell(). Protótipo int fsetpos(FILE *ptrArq, fpos_t *pos); Sintaxe fsetpos (variavelPonteiroArquivo, &pos); A função fsetpos retorna 0 se bem sucedida e –1, se não for. Observe a equivalência entre as funções: fsetpos (variavelPonteiroArquivo, &pos); � fseek (variavelPonteiroArquivo, pos, SEEK_SET); Atenção Na função fseek(), pos recebe, normalmente, o retorno da função ftell() e, é uma variável do tipo long int. Na função fsetpos(), pos recebe de fgetpos(). Isso não é rígido. Outras funções Função: remove() Essa função apaga o arquivo especificado. Protótipo int remove(const char *nomeArquivo); Sintaxe remove (nomeArquivo); /*Entre aspas se for constante*/ Como é uma função do tipo int, tem retorno, sendo 0 se a remoção for bem sucedida e diferente de 0, se não for. O nome do arquivo é um vetor de char e se for uma constante, precisa estar entre aspas. Função: rename() Essa função renomeia um arquivo. Protótipo int rename(const char *nomeAtual, const char *novoNome); Sintaxe rename (nomeAtual, novoNome); /*Entre aspas se for constante*/ Como é uma função do tipo int, tem retorno, sendo 0 se a ação de renomear for bem sucedida e diferente de 0, se não for. O nome do arquivo é um vetor de char e se for uma constante, precisa estar entre aspas. Questionamentos comuns de um desenvolvedor Um desenvolvedor quando olha para um programa finalizado que começou a fazer há uma semana, ou duas, ou meses se questiona: São tantos os porquês que seria melhor começar do zero do que alterar o que está funcionando. Mas, resolvemos não fazer nenhuma alteração, pois como o “olhar” vai mudando e se tornando mais crítico, nunca conseguiremos chegar ao ideal. Finalizando Esperamos que seu convívio com as disciplinas de Lógica de Programação e de Linguagem de Programação I tenha sido prazeroso e com perspectivas de aplicação no seu dia a dia. Deixamos de presente, um arquivo Tradutor, muito primitivo ainda, visto que precisa receber outros trechos para começar a ficar bom. Contamos com você. Saiba mais Faça o download do Programa Tradutor <galeria/aula10/anexo/a10_doc05.pdf> . Referências Próximos Passos Explore mais Pesquise na internet sites, vídeos e artigos relacionados ao conteúdo visto. file:///W:/2018.2/linguagem_de_programacao_i__conv010/galeria/aula10/anexo/a10_doc05.pdf Se ainda tiver alguma dúvida, fale com seu professor online, utilizando os recursos disponíveis no ambiente de aprendizagem.
Compartilhar