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 –
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++.