C Programação: Como acessar os arquivos armazenados no aleatório armazenamento
o acesso de arquivo aleatório em 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 para cá, para lá, e até mesmo yon. Este tipo de acesso funciona melhor quando o arquivo é pontilhada com os registros do mesmo tamanho. A noção de registros traz estruturas, que podem ser facilmente escritos para um arquivo e, em seguida, pegou de volta individualmente, de forma seletiva, ou todos de uma vez.
Como ler e rebobinagem
Tal como o seu programa lê dados de um arquivo, ele mantém o controle da posição a partir de dados onde é lido no arquivo. A posição do cursor é mantido de modo que o local em que o código está lendo ou gravando em um arquivo não está perdida.
Quando você abre 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 confuso, a posição do cursor é muitas vezes referido como um ponteiro de arquivo, mesmo que ele não é uma variável ponteiro ou um tipo de arquivo de ponteiro. É 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 rewind (). A função ftell () retorna a posição do cursor atual que está deslocamento como um valor int longa. A função rewind () move o cursor para o início do arquivo.
O loop while em Tell e Rewind lê registros do arquivo bond.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 lido), a posição do cursor é reposto para o início do arquivo pela função rewind () na Linha 29.
DIGA e retroceder
#include #include #include int main () {entrada struct {char ator [32] -int título no ano-char [32] - * contagem A007-int = = 0-A007 fopen ( "vínculo struct entrada bond-FILE -} .db "," r ") - if (! A007) {puts (" SPECTRE ganha "!) - exit (1) -} while (fread (bond, sizeof (struct entrada), 1, A007)) {printf ( "% s t% d t% s n", bond.actor, bond.year, bond.title) -se (ftell (A007)> sizeof (struct entrada)) rewind (A007) -count ++ - if ( contagem> 10) break-} fclose (A007) -Retornar (0) -}
Para determinar a adequada compensação, uma declaração se compara o resultado da função e sizeof operador ftell () sobre a entrada estrutura. Tenha em mente que ftell () simplesmente retorna um valor int tempo, não um número específico de estruturas.
A contagem variável, declarada e inicializada na Linha 14, mantém o controle de quantas vezes o loop se repete quando. Se isso não aconteceu, o programa iria repetir indefinidamente. Isso é ruim. Assim, quando o valor de contagem é maior que 10, os intervalos de ansa e, em seguida, fecha o ficheiro e o programa termina.
Exercício 1: Digite o código-fonte de contar e Rewind em seu editor. Criar e executar para ver como as funções ftell () e rewind () operam.
Como encontrar um registro específico
Quando um arquivo contém registros de todos do mesmo tamanho, você pode usar a função fseek () para arrancar qualquer item individual. O formato para fseek () é
fseek (manusear, compensados, de onde) -
manusear é um identificador de arquivo, um ponteiro de arquivo representa um arquivo que está aberto para leitura. compensar é o número de bytes desde o 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 no final de um arquivo, respectivamente.
Enquanto o seu arquivo contém registros de um tamanho constante, você pode usar fseek () para arrancar qualquer registro específico, como mostrado na Localizar um registro específico em um arquivo.
ENCONTRE um registro específico em um arquivo
#include #include #include int main () {entrada struct {char ator [32] -int título no ano-char [32] -} - struct entrada bond-FILE * A007-A007 = fopen ( "bond.db", " r ") - se (! A007) {puts (" SPECTRE ganha "!) - exit (1) -} fseek (A007, sizeof (struct entrada) * 1, SEEK_SET) -fread (bond, sizeof (struct entrada), 1, A007) -printf ( "% s t% d t% s n", bond.actor, bond.year, bond.title) -fclose (A007) -Retornar (0) -}
O código mostrado na Localizar 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. A posição do cursor de modo a que a função fread () que se segue (referem-se a linha 22) lê um registo específico localizada no interior da base de dados.
Na Linha 21, a função fseek () examina o arquivo representado pelo A007 alça. O desvio é calculado pela multiplicação da dimensão da estrutura de entrada.
Tal como acontece com uma matriz, multiplicando-se que o tamanho de um produz o segundo registro no file- multiplicar o valor por 0 (ou apenas especificar 0 na função) para ler o primeiro registro. A constante SEEK_SET garante que fseek () começa a procurar a partir do início do ficheiro.
O efeito líquido do código é que o segundo registro no arquivo bond.db é exibida.
Exercício 2: Digite o código-fonte do Localizar um registro específico em um arquivo. Construir e correr para ver o segundo registro no arquivo.