Função C++ Seekg()

Funcao C Seekg



Na programação C++, a função seekg() fornece ajuda nos fluxos de arquivos. É membro da biblioteca iostream e você o encontrará no cabeçalho . Esta função permite que os programadores manipulem onde começa a próxima operação de entrada, agilizando assim o processo de trabalho com arquivos. O método seekg() permite pular para um local específico em um arquivo, o que é inestimável quando você precisa ler ou processar dados que não estão organizados sequencialmente. Quer você pretenda ler do início, do meio ou do fim de um arquivo, seekg() fornece a flexibilidade necessária para tais tarefas. Ao longo deste guia, nos aprofundaremos em como as funções seekg() em C++ permitem a recuperação de dados de vários pontos em um arquivo.

Sintaxe e parâmetros da função Seekg() em C++

Seekg() pode ser implementado com duas sintaxes:

1. Sintaxe Streampos

fluxo & buscando ( postagem streampos ) ;

Esta sintaxe utiliza apenas um parâmetro, position, que representa a posição do cursor no buffer de fluxo. Representa um valor “int” e do tipo streampos.







2. Sintaxe de deslocamento e direção

fluxo & buscando ( transmitir frequentemente , ios_base :: procurar é sujeira ) ;

Esta sintaxe recebe dois parâmetros como entrada: deslocamento e direção. O parâmetro “ofst” é um inteiro do tipo streamoff que indica o deslocamento no buffer do stream. O parâmetro “sujeira” busca direção.



  • ios_base::beg: deslocamento desde o início do buffer do stream.
  • ios_base::cur: deslocamento da posição atual no buffer do stream.
  • ios_base::end: deslocamento do último buffer do stream.

A função seekg() em C++ manipula o ponteiro do arquivo, permitindo ao programador posicioná-lo em um local específico dentro do arquivo. Ele retorna a modificação do objeto “istream” (*this) e ajusta o ponteiro do arquivo de acordo.



Tratamento de erros e exceções na função C++ Seekg()

A função seekg() em C++ garante a garantia básica para tratamento de exceções, mantendo a validade do objeto caso ocorra uma exceção. Ele pode lançar exceções de “falha” quando o sinalizador de estado de erro carece de informações, e a função captura e gerencia essas exceções de maneira responsável, lançando-as novamente se um bit ruim foi definido na última chamada.





Além disso, um problema comum com seekg() ocorre quando ele atinge o fim do arquivo (EOF), fazendo com que o ponteiro permaneça indefinido e disparando um erro. O método clear() é utilizado para redefinir o ponteiro e resolver os erros relacionados ao EOF para resolver isso. Além disso, seekg() pode correr o risco de alterar um objeto de fluxo em um ambiente multithread, necessitando de cautela e da implementação de mecanismos de sincronização para mitigar as possíveis alterações do objeto “ofstream”.

Exemplo 1: Noções básicas de Seekg()

No primeiro exemplo, explicaremos o básico da função seekg() em C++. O código de um programa C++ é fornecido a seguir. Dê uma olhada primeiro e depois passaremos para a explicação de cada seção do código.



#include

#include

usando namespace std ;

interno principal ( interno argc , Caracteres ** argumento ) {

arquivo fstream sg ( 'seekgFile.txt' , iOS :: em | iOS :: fora | iOS :: porta-malas ) ;

sgArquivo << 'função procurarkg()' ;

sgArquivo. buscando ( 8 , iOS :: implorar ) ;

Caracteres sgArray [ 8 ] ;

sgArquivo. ler ( sgArray , 8 ) ;

sgArray [ 8 ] = 0 ;

corte << sgArray << fim ;

sgArquivo. fechar ( ) ;

}

O programa inclui dois arquivos de cabeçalho necessários – e – para manipulação de arquivos e operações de entrada/saída, respectivamente. Depois, o “using namespace std;” está incluída, permitindo os identificadores C++ padrão sem especificar explicitamente o namespace. Por fim, inicia-se a função principal, que é o ponto de entrada do programa, recebendo os argumentos da linha de comando (argc e argv).

fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Aqui é criado o “sgFile”, objeto da classe “fstream”, representando um fluxo de arquivo. O arquivo denominado “seekgFile.txt” está associado ao fluxo de arquivos. O fluxo de arquivos é aberto para entrada (ios::in) e saída (ios::out). Se o arquivo existir, seu conteúdo será truncado (ios::trunc).

sgFile << “função seekg()”; – A string “seekg() function” é gravada no arquivo usando o operador “<<”.

sgFile.seekg(8, ios::beg); – A função seekg() é usada para definir o ponteiro get na 8ª posição desde o início (ios::beg) do arquivo.

sgFile.read(sgArray, 8); – A função “read” é empregada para ler oito caracteres da posição atual do ponteiro get para o “sgArray”.

sgArray[8] = 0; – Nulo encerra a matriz de caracteres para garantir um tratamento adequado da string.

cout << sgArray << endl; – O conteúdo de “sgArray” (os 8 caracteres lidos do arquivo) é exibido no console usando cout.

sgFile.close(); – A função close() é usada para fechar o fluxo de arquivos.

Espera-se que a saída deste programa seja “função”. Vamos verificar isso no seguinte trecho de saída:

O código cria um fluxo de arquivo associado ao arquivo “seekgFile.txt”, grava uma string no arquivo, busca a 8ª posição desde o início, lê oito caracteres e gera o conteúdo lido. Finalmente, o fluxo de arquivos é fechado.

Exemplo 2: Navegação Dinâmica

Considere um cenário em que você deve calcular dinamicamente o deslocamento de seekg(). Vamos entender como calcular dinamicamente o deslocamento com a ajuda de um exemplo de código.

#include

#include

usando namespace std ;

interno principal ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

interno desvio = 8 ;

sgArquivo. buscando ( desvio , iOS :: colocar ) ;

Caracteres amortecedor [ 8 ] ;

sgArquivo. ler ( amortecedor , 8 ) ;

corte << 'Contente: ' << amortecedor << fim ;

sgArquivo. fechar ( ) ;

retornar 0 ;

}

Como você pode ver, estamos lendo o conteúdo do mesmo arquivo que criamos no exemplo anterior, “seekgFile.txt”. A função seekg() define o ponteiro get na posição atual (ios::cur) no arquivo e é movido pelo deslocamento calculado (8 caracteres). A função read() lê oito caracteres da posição atual do ponteiro get para o buffer.

Dado o conteúdo do arquivo “função seekg()” e o deslocamento de oito caracteres, o programa produzirá a substring que começa no 9º caractere do arquivo. Portanto, o resultado esperado do programa é “função”. Vamos confirmar isso na seguinte saída:

Este exemplo demonstra a flexibilidade de seekg() calculando dinamicamente o deslocamento.

Exemplo 3: Navegando do Fim

Neste exemplo, demonstraremos como ler os dados de um arquivo a partir do final do arquivo. Aqui, seekg() é usado para navegar a partir do final do arquivo. O deslocamento negativo indica uma posição relativa ao final. Veja o seguinte código fornecido:

#include

#include

usando namespace std ;

interno principal ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

sgArquivo. buscando ( - 4 , iOS :: fim ) ;

Caracteres amortecedor [ 8 ] ;

sgArquivo. ler ( amortecedor , 8 ) ;

corte << 'Contente: ' << amortecedor << fim ;

sgArquivo. fechar ( ) ;

retornar 0 ;

}

Este programa C++ abre um arquivo chamado “seekgFile.txt” que move o ponteiro get de quatro caracteres para trás a partir do final do arquivo usando sgFile.seekg(-4, ios::end), lê os próximos oito caracteres daquela posição para um buffer e, em seguida, imprime o conteúdo do buffer no console. Dado o conteúdo do arquivo como “função seekg()”, a saída esperada é “ction”. Vamos combinar a saída na captura de tela da seguinte saída:

Conclusão

Em resumo, seekg() surge como um recurso valioso para navegar com precisão nos fluxos de arquivos. Através de sua capacidade de buscar posições arbitrárias, calcular dinamicamente os deslocamentos e navegar a partir de diferentes pontos dentro de um arquivo, seekg() capacita os desenvolvedores a lidar com as operações do arquivo de forma eficiente. Como vimos nos exemplos, dominar seekg() aprimora seu controle e flexibilidade ao trabalhar com fluxos de arquivos em C++. No entanto, exige uma consideração cuidadosa do tratamento de exceções e de possíveis cenários de corrida de dados para garantir operações de arquivo robustas e livres de erros em C++.