Olá, seja bem-vindo de volta.
Nesta palestra, farei uma demonstração de nosso desafio anterior, que é
imprimir o conteúdo de um arquivo na ordem inversa.
Portanto, você precisará entender o método ftel e o método fseek.
Vamos trazer blocos de código e criar um novo projeto.
E este projeto será um aplicativo de console.
Vamos apenas nomeá-lo
para imprimir o conteúdo do arquivo
ao contrário.
E vamos primeiro criar nosso arquivo que contém alguns dados vazios
porque precisamos ler a partir dele. Vou voltar ao meu diretório de downloads, que é
onde estão meus projetos de blocos de código.
E vou para o projeto
que acabei
de criar, que é denominado imprimir o conteúdo do arquivo.
Então está bem aqui. Vou apenas criar um novo arquivo, um arquivo de texto.
Diremos novo documento de texto. Vamos chamá-lo de teste. texto.
E aí dentro, farei o normal,
oi meu nome
é Jason, como vai você, estou bem.
E o que isso vai fazer, vou salvá-lo, e então vamos começar a imprimir o final.
Portanto, ele deve imprimir enif space gniod e assim por diante até chegar ao início.
Portanto, voltaremos aos blocos de código e
precisaremos incluir nosso IO padrão, porque ele
contém todas as nossas funções. Vamos criar uma
constante, neste caso definir.
E isso vai se chamar nome do arquivo, vai se chamar teste. texto.
E vou precisar criar meu ponteiro de arquivo primeiro, então tudo maiúsculo em
FILE star fp, e vou definir isso igual a null, inicializá-lo.
E também vou criar alguns contadores e algo
para representar o que é retornado - vou carregar o contador para
o meu loop e a
contagem dos bytes reais que são retornados do ftell.
Portanto, vou dizer que a contagem é igual a zero e, em seguida,
uma variável de controle de loop em I é igual a zero.
Eu vou fazer meu normal. Eu preciso abrir meu arquivo. Vou dizer que fp é
igual a fopen e passarei o nome do arquivo. Vou passar apenas leitura, então apenas r.
Vou garantir que isso não seja nulo. Vou dizer que se fp é igual a
nulo, vou apenas retornar 1 negativo.
Caso contrário, vou buscar o final do arquivo.
Então, eu quero fazer um fseek.
Aqui, vou chamar a função fseek.
Isso vai mudar a posição para onde estou apontando. Vou passar meu ponteiro de arquivo.
Vou passar zero para o nosso segundo parâmetro.
Para o terceiro parâmetro, direi buscar até o fim.
Então, vou usar esse fim de busca constante.
E isso vai definir meu ponteiro de arquivo para o final de fp,
que é teste. texto.
Quando terminar, quero definir meu contador real para o
que ele está apontando. Então, eu quero voltar para onde estou.
Portanto, aqui vou obter a posição do ponteiro do arquivo.
E o fseek realmente mudou a posição,
então ele move o ponteiro do arquivo para o final do arquivo.
Então eu o movo primeiro e então obtenho a posição. Posso obter a posição usando o ftell.
Para ftell, ele retorna a posição, então isso será armazenado em count e
eu direi f count é igual a f tell e então passarei para o ponteiro do arquivo.
Assim que tiver a posição, posso escrever um loop while
que diz ir da posição ou o contador, que é minha variável de controle de loop até o fim.
Portanto, aqui posso dizer enquanto sou menos do que contar,
porque basicamente quero ler tudo, do fim ao começo.
E aqui dentro, eu quero dizer incrementar minha variável I.
E então eu quero buscar, eu quero mudar para onde estou me mudando. Portanto, quero dizer fseek e
apontar para fp.
Quero apontar para um eu negativo porque estou
indo das costas para o começo e quero dizer busque o fim.
Então, negativo, eu estarei com tantos bytes do final.
Então, primeiro consegui ir para o final
e depois quero mudar minha posição para poder começar a ler cada personagem.
Depois de realmente buscar o fim, posso simplesmente imprimir
o caractere, ler o
caractere e imprimi-lo. Então, aqui posso apenas dizer
por cento c, e então posso dizer fgetc e
meu ponteiro de arquivo.
Então, novamente, o que estou fazendo aqui é na linha 22 ou 19, primeiro, estou
movendo meu ponteiro para o final.
Então estou obtendo meu contador porque ele me dirá quanto tempo tenho para ler cada
byte usando ftell.
Então, meu loop while vai de zero até
contar quantos bytes eu quero ler.
Na linha 26, vou incrementar o contador.
Vou então buscar os tantos bytes do final, que
é menos I do final. E então as linhas 28, vou ler esse personagem e imprimi-lo.
E essa é a principal lógica do programa.
A única outra coisa que tenho que fazer é imprimir um feed de linha
no final, apenas para facilitar a leitura. Quero fechar meu ponteiro de arquivo.
Então, eu quero dizer fp e, em seguida, quero apenas
retornar, e provavelmente quero definir fp igual a nulo.
Então, vamos tentar compilar isso, e o que veremos
é a impressão do arquivo na ordem inversa.
Não estamos mudando o conteúdo do
arquivo, estamos apenas lendo do final ao começo usando nossas funções de posição.
Portanto, ao executarmos isso, devemos ver a
ordem oposta ou reversa. E o que você notará aqui é que vemos a ordem inversa.
Então, estamos primeiro imprimindo o último arquivo.
E se abrirmos esse arquivo em nosso diretório de downloads,
você notará que
ele está sendo impresso como saída.
Ele está imprimindo um
gniod do espaço e assim por diante.
A última linha impressa é oi, meu nome é Jason ao contrário.
Portanto, é apenas um pequeno programa bacana que
usará os ponteiros de arquivo para começar no final e
então irá para o início e imprimirá o conteúdo na ordem inversa.
Portanto, observe como usamos o fseek, observe como usamos o ftell.
Fseek move o ponteiro do arquivo, o ftell realmente chega onde
você está na localização do arquivo.
Agora você pode usar a contagem para inverter.
E, novamente, use I negativo para dizer quantos bytes do final e fgetc
com um ponteiro de arquivo.
Vou fornecer esse código-fonte como uma solução e você pode compará-lo, examiná-lo
e analisá-lo com mais detalhes. Espero que tenha ajudado. Obrigada.