Índice:
Vídeo: Programação em C/C++ - Aula 18 - Manipulação de arquivos 2024
O acesso aleatório de arquivos na programação C não tem nada a ver com números aleatórios. Em vez disso, o arquivo pode ser acessado em qualquer ponto aqui, lá e até mesmo. Este tipo de acesso funciona melhor quando o arquivo é pontilhado com registros do mesmo tamanho. A noção de registros traz estruturas, que podem ser facilmente escritas em um arquivo e, em seguida, recuperadas individualmente, seletivamente ou de uma só vez.
Como ler e rebobinar
À medida que seu programa lê dados de um arquivo, ele acompanha a posição de onde os dados são lidos no arquivo. Uma posição do cursor é mantida para que a localização na qual o código esteja lendo ou escrevendo dentro de um arquivo não for perdida.
Quando você abre primeiro um arquivo, a posição do cursor está no início do arquivo, o primeiro byte. Se você ler um registro de 40 bytes na memória, a posição do cursor é de 40 bytes desde o início. Se você ler até o final do arquivo, a posição do cursor mantém esse local também.
Para manter as coisas confusas, a posição do cursor é muitas vezes referida como um ponteiro de arquivo , , mesmo que não seja uma variável de ponteiro ou um tipo de ponteiro de ARQUIVO. É simplesmente a localização dentro de um arquivo onde o próximo byte de dados é lido.
Você pode mexer com a posição do cursor usando várias funções interessantes em C. Dois deles são ftell () e rebobinar (). A função ftell () retorna a posição atual do cursor que está deslocada como um valor int longo. A função rebobinar () move o cursor de volta ao início do arquivo.
O loop while em Tell and Rewind lê nos registros da ligação. arquivo db. Na linha 28, a função ftell () retorna a posição do cursor. Se for maior do que uma entrada (o que significa que a segunda entrada foi lida), a posição do cursor é reiniciada para o início do arquivo pela função rebobinar () na Linha 29.
TELL AND REWIND
#include # incluir #include int main () {struct entry {char actor [32]; ano int; char title [32];}; struct entry bond; ARQUIVO * a007; int count = 0; a007 = fopen ("bond. db", "r"); se (! a007) {puts ("SPECTTER ganha!"); exit (1);} while (fread (& bond, sizeof (struct entry), 1, a007)) {printf ("% st% dt% sn", bond. actor, bond. year, bond. title); se (ftell (a007)> sizeof (entrada struct)) rebobinar (a007); contagem ++; se (count> 10) break;} fclose (a007); return (0);}
Para determinar o deslocamento correto, uma instrução if compara o resultado da função ftell () e do operador sizeof na entrada da estrutura. Tenha em mente que ftell () simplesmente retorna um longo valor int, não um número específico de estruturas.
A contagem de variáveis, declarada e inicializada na Linha 14, faz o controle de quantas vezes o loop while se repete. Se não o fizesse, o programa ficaria interminável. Isso é ruim. Então, quando o valor de contagem é maior que 10, o loop é quebrado e o arquivo fecha e o programa termina.
Exercício 1 : Digite o código-fonte de Tell e Rewind em seu editor. Crie e execute para ver como funcionam as funções ftell () e rebobinar ().
Como encontrar um registro específico
Quando um arquivo contém registros do mesmo tamanho, você pode usar a função fseek () para arrancar qualquer item individual. O formato para fseek () é
fseek (identificador, deslocamento, de onde);
identificador é um identificador de arquivo, um ponteiro FILE que representa um arquivo que está aberto para leitura. offset é o número de bytes do início, fim ou posição atual em um arquivo. E de onde é uma das três constantes: SEEK_SET, SEEK_CUR ou SEEK_END para o início, a posição atual ou o final de um arquivo, respectivamente.
Enquanto seu arquivo contém registros de tamanho constante, você pode usar fseek () para retirar qualquer registro específico, conforme mostrado em Encontrar um registro específico em um arquivo.
ENCONTRE UM GRUPO ESPECÍFICO EM UM ARQUIVO
#include #include #include int main () {struct entry {char actor [32]; ano int; char title [32];}; struct entry bond; ARQUIVO * a007; a007 = fopen ("bond. db", "r"); se (! a007) {puts ("SPECTTER ganha!"); saída (1);} fseek (a007, sizeof (entrada de estrutura) * 1, SEEK_SET); fread (& bond, sizeof (struct entry), 1, a007); printf ("% st% dt% sn", bond. actor, bond. year, bond. title); fclose (a007); return (0);}
O código mostrado em Encontrar um registro específico em um arquivo é novamente bastante semelhante ao código mostrado na Listagem 22-9. A grande adição é a função fseek (), mostrada na Linha 21. Ela define a posição do cursor de modo que a função fread () que segue (consulte a Linha 22) lê em um registro específico localizado dentro do banco de dados.
Na linha 21, a função fseek () examina o arquivo representado pelo identificador a007. O deslocamento é calculado multiplicando o tamanho da estrutura de entrada.
Tal como acontece com uma matriz, multiplicar esse tamanho por 1 produz o segundo registro no arquivo; multiplique o valor por 0 (ou apenas especifique 0 na função) para ler o primeiro registro. A constante SEEK_SET garante que fseek () comece a olhar desde o início do arquivo.
O efeito líquido do código é o segundo registro na ligação. O arquivo db é exibido.
Exercício 2: Digite o código-fonte de Localizar um registro específico em um arquivo. Crie e execute para ver o segundo registro no arquivo.