Monday 7 May 2018

Wofstream opções binárias


Estou lendo um arquivo binário como: Mas eu estou percebendo que este não é um verdadeiro binário ler. O ifstream realmente lê um byte e o converte em um char largo. Portanto, se o arquivo binário tiver o conteúdo 0x112233. Ff. Eu realmente ler 0x110022003300. Ff00. Isso não faz muito sentido para mim: primeiro, eu só preciso usar um fstream largo porque o nome do arquivo não é latino. Em segundo lugar, se eu disser que o fstream é binário, por que ler ler caracteres largos O código abaixo faz o que eu quero. Existe uma maneira de conseguir isso usando fstreams std perguntou Mar 21 11 às 19:15 I39m usando Visual Studio para Windows e compilador Intel para Linux. Sua solução funcionou bem no Windows. Eu ainda não tentei isso no Linux. É uma solução bastante elegante. I39d preferem não confiar em extensões compilador embora. Você acha que pode fazer isso aderindo ao padrão, talvez especificando o charset como um parâmetro de modelo para ifstream ndash rturrado Mar 22 11 às 15:15 rturrado: (removido meu comentário anterior) Eu não recomendo mais Boost. Filesystem desde a sua Abordagem é definir diferentes interfaces em diferentes plataformas, o que basicamente causa problemas de portabilidade e torna de fato mais difícil escrever código Unicode correto. De minha experiência, é melhor seguir a aproximação que eu escrevi no EDIT. Ndash ybungalobill Ago 23 12 às 13: 00C Arquivo binário IO Normalmente, para o arquivo binário io você não usa o ltlt e operadores convencionais orientados a texto Pode ser feito, mas isso é um tópico avançado. Modelo Básico para Arquivo IO Em C, as classes de fluxo de arquivos são projetadas com a idéia de que um arquivo deve simplesmente ser visto como um fluxo ou matriz de bytes não interpretados. Por conveniência, a matriz de bytes armazenados em um arquivo é indexada de zero a len -1, onde len é o número total de bytes em todo o arquivo. Cada arquivo aberto tem duas posições associadas a ele: A posição de leitura atual, que é o índice do próximo byte que será lido a partir do arquivo. Isso é chamado de ponteiro get, pois aponta para o próximo caractere que o método get básico retornará. A posição de escrita atual, que é o índice do local de byte onde o próximo byte de saída será colocado. Isso é chamado de ponteiro put, uma vez que aponta para o local onde o método básico colocar colocará seu parâmetro. Essas duas posições de arquivo são independentes e qualquer um pode apontar em qualquer lugar em todos os no arquivo. Obtendo o tamanho de um arquivo A maneira típica de obter o tamanho de um arquivo é usar a função de biblioteca C stat. Observe que o segundo parâmetro para stat é um ponteiro. É sua responsabilidade criar e gerenciar a memória onde stat irá colocar seus resultados, eo endereço dessa memória é o que você deve passar como este segundo parâmetro. O exemplo acima mostra o uso de uma variável local para conter os resultados retornados por stat. Abrindo um arquivo Um objeto de fluxo de arquivos pode ser aberto de duas maneiras. Primeiro, você pode fornecer um nome de arquivo junto com um parâmetro de modo io ao construtor ao declarar um objeto: Como alternativa, após um objeto de fluxo de arquivos ter sido declarado, você pode chamar seu método aberto: Qualquer abordagem funcionará com um ifstream. Uma corrente. Ou um objeto fstream. Normalmente, ao manipular arquivos de texto, um omite o segundo parâmetro (o parâmetro modo io). No entanto, para manipular arquivos binários, você deve sempre especificar o modo io, incluindo ios :: binário como um dos flags de modo. Para readwrite acesso a um arquivo, use um fstream. Nota: Se você é um usuário GNU g (versão 2.7.x ou anterior), então não use flags de modo io ao abrir objetos ifstream. Devido a um bug na implementação de libg do GNU, os flags não serão interpretados corretamente. Se você estiver trabalhando em Unix, omita os sinalizadores de modo io completamente se você estiver trabalhando com g em MS-DOS e, em seguida, use um objeto fstream. Esta nota aplica-se apenas aos utilizadores g. Leitura de um arquivo Para ler de um objeto fstream ou ifstream, use o método read. Este método leva dois parâmetros: A função de membro de leitura extrai um dado número de bytes do dado fluxo, colocando-os na memória apontada pelo primeiro parâmetro. É de sua responsabilidade criar e gerenciar a memória onde ler colocará seu resultado, bem como garantir que ele é grande o suficiente para conter o número de bytes solicitados. Os bytes que são lidos e não interpretados, o método não assume nada sobre terminações de linha e o método de leitura não coloca um terminador nulo no final dos bytes que são lidos. Se ocorrer um erro durante a leitura (por exemplo, Se você ler o final de um arquivo), o fluxo é colocado em um estado de erro. Se isso ocorrer, você pode usar o método gcount para descobrir o número de caracteres que foram realmente ler e usar o método clear para redefinir o fluxo para um estado utilizável. Uma vez que um fluxo entra em um estado de erro, todas as operações de leitura futuras falharão. Reposicionando o ponteiro de obtenção Para alterar a posição do ponteiro de obtenção (a posição de leitura de arquivo) de um objeto fstream ou ifstream, use o método seekg. A forma básica desta operação tem um único parâmetro: Um streampos é essencialmente um valor inteiro inteiro não assinado. Seekg move o ponteiro get para a posição de arquivo absoluto especificada (onde 0 é o início do arquivo). Ao chamar seekg tenha cuidado com os tipos de seus argumentos: O problema acima é que os arquivos podem ser relativamente grandes, então streampos pode conter números muito grandes. Mas acima, se númeroblk é acima de 63. Devido aos tipos de blknumber e BLKSIZE (ambos int s), em um PC seu produto só pode ser de 16 bits de largura. Para corrigir isso, certifique-se de que as constantes usadas no posicionamento do arquivo são longas, ou que todas as variáveis ​​usadas nesse posicionamento são quantidades longas, ou ambas. Você pode determinar a posição atual do ponteiro obtido usando myFile. tellg (), um método sem parâmetros que retorna o índice do ponteiro get no fluxo fornecido. Há também uma variante de seekg que permite que você especifique uma posição em relação à localização atual do ponteiro get ou relativa ao final do arquivo. Escrevendo em um arquivo Para gravar em um objeto fstream ou ofstream, use o método write. Este método tem dois parâmetros: A função de membro escreve escreve um dado número de bytes no dado fluxo, começando na posição do ponteiro put. Se o ponteiro put é atual no final do arquivo, o arquivo é estendido. Se o ponteiro put aponta para o meio do arquivo, os caracteres no arquivo são substituídos pelos novos dados. Os bytes que são escritos e não interpretado, nenhum retorno de carro é adicionado após os dados eo método de gravação não assume que há um terminador nulo no final dos bytes que estão sendo gravados. Se ocorrer um erro durante a gravação (por exemplo, se você ficar sem espaço em disco), o fluxo será colocado em um estado de erro. Tais erros não são tão comuns como os erros de leitura, e muitas vezes não são verificados. Reposicionamento do ponteiro de inserção Para alterar a posição do ponteiro de put (a posição de leitura de arquivo) de um objeto fstream ou de fluxo, use o método seekp. A forma básica desta operação tem um único parâmetro: Um streampos é essencialmente um valor inteiro inteiro não assinado. Seekp move o ponteiro put para a posição de arquivo absoluto especificada (onde 0 é o início do arquivo). Você pode determinar a posição do ponteiro atual usando myFile. tellp (), um método sem parâmetros que retorna o índice do ponteiro put no fluxo fornecido. Há também uma variante de seekp que permite que você especifique uma posição relativa ao ponteiro local atual, ou relativa ao final do arquivo. Ler e escrever dados complexos Embora os métodos de leitura e escrita aceitem um ponteiro char, não há nenhuma exigência de que os dados que você lê ou escreva sejam mantidos em uma matriz char. Você pode ler ou escrever objetos de dados complexos usando a fundição de tipos simples de ponteiros: Fechando um arquivo Para todos os objetos de fluxo de arquivos, use: ofstream :: ofstream O nome do arquivo a ser aberto durante a construção. Um inteiro que contém bits de modo definidos como enumeradores ios que podem ser combinados com o operador bitwise OR (). O parâmetro nMode deve ter um dos seguintes valores: ios :: app A função executa uma busca para o final do arquivo. Quando novos bytes são gravados no arquivo, eles sempre são anexados ao final, mesmo se a posição é movida com a função ostream :: seekp. Ios :: ate A função executa uma busca para o final do arquivo. Quando o primeiro novo byte é gravado no arquivo, ele é anexado ao final, mas quando os bytes subseqüentes são gravados, eles são gravados para a posição atual. ios :: in Se este modo for especificado, então o arquivo original Existe) não será truncated. ios :: out O arquivo é aberto para saída (implícito para todos os objetos do fluxo).ios :: trunc Se o arquivo já existir, seu conteúdo será descartado. Este modo está implícito se ios :: out for especificado e ios :: ate. Ios :: app. E ios: in não são especificados. ios :: nocreate Se o arquivo ainda não existir, a função fails. ios :: noreplace Se o arquivo já existir, a função fails. ios :: binário Abre o arquivo no modo binário Padrão é o modo texto). A especificação de proteção de arquivo é padrão para o inteiro estático filebuf :: openprot que é equivalente a filebuf :: shcompat. Os possíveis valores nProt são: filebuf :: shcompat Modo de compartilhamento de compatibilidade. Filebuf :: shnone Modo exclusivo no shared. filebuf :: shread Permissão de compartilhamento de leitura allowed. filebuf :: shwrite Permissão de compartilhamento de escrita. Para combinar os modos filebuf :: shread e filebuf :: shwrite, use o operador lógico OR (). Um descritor de arquivo como retornado por uma chamada para a função run-time open ou sopen filedesc é um typedef equivalente a int. Ponteiro para uma área de reserva previamente alocada de comprimento nLength. Um valor NULL (ou nLength 0) indica que o fluxo será unbuffered. O comprimento (em bytes) da área de reserva (0 unbuffered). Os quatro construtores ofstream são:

No comments:

Post a Comment