Sunday 24 September 2017

Opções Freopen Stdout Binárias


A resposta simples é não. O modo é determinado quando o objeto iostream é construído e não pode ser alterado posteriormente. Algumas implementações podem fornecer um meio de fazê-lo mais tarde, mas isso não está padronizado. Em algumas implementações, fazer um freopen no stdout pode mudar o modo, embora eu pense que formalmente, isso é proibido em C. (É implementação definida em C.) E, aparentemente, ele não funciona em sua implementação. Você é a melhor opção é descobrir como seu sistema nomeia o dispositivo de console (devtty em Unix CONS. Eu acho que, no Windows), abra-o no modo desejado e entregue-o. Respondeu 16 de abril 14 às 11: 34freopen (3) - Página do manual do Linux fopen, fdopen, freopen - funções de fluxo aberto Função Teste Macro Requisitos para glibc (veja featuretestmacros (7)): fdopen (): POSIXCSOURCE gt 1 XOPENSOURCE POSIXSOURCE Descrição O fopen () Abre o arquivo cujo nome é a string apontada pelo caminho e associa um fluxo com ele. O modo de argumento aponta para uma cadeia começando com uma das seguintes sequências (possivelmente seguidas de caracteres adicionais, conforme descrito abaixo): r Abra o arquivo de texto para leitura. O fluxo está posicionado no início do arquivo. Aberto para leitura e escrita. O fluxo está posicionado no início do arquivo. Truncar arquivo para zero comprimento ou criar arquivo de texto para escrever. O fluxo está posicionado no início do arquivo. Aberto para leitura e escrita. O arquivo é criado se não existir, caso contrário, ele está truncado. O fluxo está posicionado no início do arquivo. Aberto para anexar (escrever no final do arquivo). O arquivo é criado se não existir. O fluxo está posicionado no final do arquivo. Aberto para leitura e adição (escrita no final do arquivo). O arquivo é criado se não existir. A posição inicial do arquivo para leitura está no início do arquivo, mas a saída sempre é anexada ao final do arquivo. A seqüência de modo também pode incluir a letra b como um último caractere ou como um caractere entre os caracteres em qualquer uma das cadeias de dois caracteres descritos acima. Isto é estritamente para compatibilidade com o C89 e não tem efeito, o b é ignorado em todos os sistemas compatíveis com POSIX, incluindo o Linux. (Outros sistemas podem tratar arquivos de texto e arquivos binários de forma diferente, e adicionar o b pode ser uma boa idéia se você fizer IO em um arquivo binário e esperar que seu programa possa ser portado para ambientes não-UNIX.) Veja NOTAS abaixo para detalhes de Extensões glibc para o modo. Todos os arquivos criados terão o modo SIRUSR SIWUSR SIRGRP SIWGRP SIROTH SIWOTH (0666), conforme modificado pelo valor umask dos processos (veja umask (2)). Lê e escreve pode ser misturado em fluxos readwrite em qualquer ordem. Observe que o ANSI C exige que uma função de posicionamento de arquivo intervenha entre saída e entrada, a menos que uma operação de entrada encontre o fim do arquivo. (Se esta condição não for atendida, uma leitura é permitida para retornar o resultado de gravações que não sejam as mais recentes.) Portanto, é uma boa prática (e às vezes, necessário no Linux) colocar uma fseek (3) ou fgetpos (3 ) Operação entre operações de gravação e leitura em tal fluxo. Esta operação pode ser um aparente no-op (como no fseek (. 0L, SEEKCUR) chamado para seu efeito colateral de sincronização. Abrir um arquivo no modo de anexar (um como o primeiro caractere do modo) faz com que todas as operações de gravação subseqüentes a este fluxo to Ocorre no final do arquivo, como se tivesse precedido a chamada: A função fdopen () associa uma transmissão com o descritor de arquivo existente, fd. O modo da transmissão (um dos valores r, r, w, w, a, A) deve ser compatível com o modo do descritor de arquivo. O indicador de posição do arquivo do novo fluxo é definido como pertencente a fd. E o erro e os indicadores de fim de arquivo são apagados. Os modos w ou w não causam truncamento Do arquivo. O descritor do arquivo não é enganado e será fechado quando o fluxo criado por fdopen () estiver fechado. O resultado da aplicação de fdopen () para um objeto de memória compartilhada é indefinido. A função freopen () abre o arquivo cujo O nome é a cadeia apontada pelo caminho e associa o fluxo apontado pelo fluxo com ele. O fluxo original (se Existe) está fechado. O argumento do modo é usado exatamente como na função fopen (). O uso principal da função freopen () é alterar o arquivo associado a um fluxo de texto padrão (stderr. Stdin ou stdout). Valor de retorno Após a conclusão bem sucedida fopen (), fdopen () e freopen () retornam um ponteiro do arquivo. Caso contrário, NULL é retornado e errno está configurado para indicar o erro. O modo fornecido para fopen (), fdopen () ou freopen () foi inválido. As funções fopen (), fdopen () e freopen () também podem falhar e definir errno para qualquer um dos erros especificados para o malloc de rotina (3). A função fopen () também pode falhar e definir errno para qualquer um dos erros especificados para a rotina aberta (2). A função fdopen () também pode falhar e definir errno para qualquer um dos erros especificados para a rotina fcntl (2). A função freopen () também pode falhar e definir errno para qualquer um dos erros especificados para as rotinas abertas (2), fclose (3) e fflush (3). Conformando-se às funções fopen () e freopen () conforme a C89. A função fdopen () está em conformidade com POSIX.1-1990. Notas da Glibc A biblioteca do GNU C permite as seguintes extensões para a string especificada no modo. C (desde glibc 2.3.3) Não faça a operação aberta, nem operações subseqüentes de leitura e gravação, pontos de cancelamento de thread. Esta bandeira é ignorada para fdopen (). E (desde glibc 2.7) Abra o arquivo com o sinalizador OCLOEXEC. Veja abrir (2) para obter mais informações. Esta bandeira é ignorada para fdopen (). M (desde glibc 2.3) Tente acessar o arquivo usando mmap (2), em vez de chamadas de sistema IO (leia (2), escreva (2)). Atualmente, o uso do mmap (2) só é tentado para um arquivo aberto para leitura. X Abra o arquivo exclusivamente (como o sinalizador OEXCL de abrir (2)). Se o arquivo já existe, fopen () falha e define errno para EEXIST. Esta bandeira é ignorada para fdopen (). Além dos caracteres acima, fopen () e freopen () suportam a seguinte sintaxe no modo. A string dada é tomada como o nome de um conjunto de caracteres codificados e o fluxo está marcado como orientado para a largura. Posteriormente, as funções internas de conversão convertem IO para e da cadeia de caracteres. Se a sintaxe da cadeia ccs não for especificada, a orientação ampla do fluxo será determinada pela primeira operação do arquivo. Se essa operação for uma operação de caractere largo, o fluxo é marcado de forma ampla e as funções para converter no conjunto de caracteres codificados são carregadas. Ao analisar os caracteres de bandeira individuais no modo (ou seja, os caracteres que precedem a especificação ccs), a implementação glibc de fopen () e freopen () limita o número de caracteres examinados no modo a 7 (ou, em versões glibc anteriores a 2,14, a 6 , O que não foi suficiente para incluir possíveis especificações, como rbcmxe). A implementação atual de fdopen () analisa no máximo 5 caracteres no modo. O fluxo de ByReopen referenciado com um arquivo ou modo diferente Reutiliza o fluxo para abrir o arquivo especificado pelo nome do arquivo ou para mudar seu modo de acesso. Se um novo nome de arquivo for especificado, a função primeiro tenta fechar qualquer arquivo já associado ao fluxo (terceiro parâmetro) e desassociá-lo. Então, independentemente de esse fluxo ter sido fechado com sucesso ou não, o freopen abre o arquivo especificado pelo nome do arquivo e o associa com o fluxo, assim como fopen faria usando o modo especificado. Se o nome do arquivo for um ponteiro nulo, a função tenta mudar o modo da transmissão. Embora uma implementação particular da biblioteca tenha permissão para restringir as alterações permitidas, e em que circunstâncias. O indicador de erro e o indicador eof são apagados automaticamente (como se fosse chamado clearerr). Esta função é especialmente útil para redirecionar fluxos predefinidos como stdin. Stdout e stderr para arquivos específicos (veja o exemplo abaixo). Parâmetros filename Seqüência C contendo o nome do arquivo a ser aberto. Seu valor deve seguir as especificações do nome do arquivo do ambiente em execução e pode incluir um caminho (se suportado pelo sistema). Se esse parâmetro for um ponteiro nulo, a função tentará alterar o modo da transmissão. Como se o nome do arquivo atualmente associado a esse fluxo tivesse sido usado. Cadeia de modo C contendo um modo de acesso a arquivos. Pode ser: ler: abrir arquivo para operações de entrada. O arquivo deve existir. Escreva: crie um arquivo vazio para operações de saída. Se um arquivo com o mesmo nome já existe, seu conteúdo é descartado e o arquivo é tratado como um novo arquivo vazio. Anexar: Abra o arquivo para saída no final de um arquivo. As operações de saída sempre escrevem dados no final do arquivo, expandindo-o. As operações de reposicionamento (fseek. Fsetpos. Rebobinar) são ignoradas. O arquivo é criado se não existir. Readupdate: Abra um arquivo para atualização (tanto para entrada quanto para saída). O arquivo deve existir. Writeupdate: Crie um arquivo vazio e abra-o para atualização (tanto para entrada quanto para saída). Se um arquivo com o mesmo nome já existir, seus conteúdos serão descartados e o arquivo será tratado como um novo arquivo vazio. Appendupdate: Abra um arquivo para atualização (tanto para entrada quanto para saída) com todas as operações de saída que escrevem dados no final do arquivo. As operações de reposicionamento (fseek. Fsetpos. Remwind) afetam as próximas operações de entrada, mas as operações de saída movem a posição de volta ao final do arquivo. O arquivo é criado se não existir. Com os especificadores de modo acima, o arquivo está aberto como um arquivo de texto. Para abrir um arquivo como um arquivo binário. Um caractere b deve ser incluído na seqüência de modo. Este caractere B adicional pode ser anexado no final da string (fazendo assim os seguintes modos compostos: rb, wb, ab, rb, wb, ab) ou seja inserido entre a letra e o sinal para os modos mistos (rb, Wb, ab). O novo padrão C (C2011, que não faz parte de C) adiciona uma nova subespecificadora padrão (x), que pode ser anexada a qualquer especificador w (para formar wx. Wbx. Wx ou wbxwbx). Este sub-especificador força a função a falhar se o arquivo existe, em vez de substituí-lo. Se os caracteres adicionais seguem a seqüência, o comportamento depende da implementação da biblioteca: algumas implementações podem ignorar caracteres adicionais, de modo que, por exemplo, um t adicional (às vezes usado para indicar explicitamente um arquivo de texto) é aceito. Em algumas implementações de biblioteca, abrir ou criar um arquivo de texto com modo de atualização pode tratar o fluxo em vez disso como um arquivo binário. Transmitir ponteiro para um objeto FILE que identifica o fluxo a ser reaberto. Valor de retorno Se o arquivo for reaberto com sucesso, a função retornará o ponteiro passado como fluxo de parâmetros. Que pode ser usado para identificar o fluxo reaberto. Caso contrário, um ponteiro nulo é retornado. Na maioria das implementações da biblioteca, a variável errno também é definida como um código de erro específico do sistema na falha. Define o arquivo cujo nome é especificado no nome do arquivo do parâmetro e o associa a um fluxo que pode ser identificado em futuras operações pelo ponteiro do arquivo retornado . As operações que são permitidas no fluxo e como elas são executadas são definidas pelo parâmetro de modo. O fluxo retornado é totalmente armazenado por buffer, se for conhecido por não se referir a um dispositivo interativo (veja setbuf). O ponteiro retornado pode ser desassociado do arquivo chamando fclose ou freopen. Todos os arquivos abertos são fechados automaticamente no término normal do programa. O ambiente em execução suporta, pelo menos, arquivos FOPENMAX abertos simultaneamente. Parâmetros filename Seqüência C contendo o nome do arquivo a ser aberto. Seu valor deve seguir as especificações do nome do arquivo do ambiente em execução e pode incluir um caminho (se suportado pelo sistema). Cadeia de modo C contendo um modo de acesso a arquivos. Pode ser: ler: abrir arquivo para operações de entrada. O arquivo deve existir. Escreva: crie um arquivo vazio para operações de saída. Se um arquivo com o mesmo nome já existe, seu conteúdo é descartado e o arquivo é tratado como um novo arquivo vazio. Anexar: Abra o arquivo para saída no final de um arquivo. As operações de saída sempre escrevem dados no final do arquivo, expandindo-o. As operações de reposicionamento (fseek. Fsetpos. Rebobinar) são ignoradas. O arquivo é criado se não existir. Readupdate: Abra um arquivo para atualização (tanto para entrada quanto para saída). O arquivo deve existir. Writeupdate: Crie um arquivo vazio e abra-o para atualização (tanto para entrada quanto para saída). Se um arquivo com o mesmo nome já existir, seus conteúdos serão descartados e o arquivo será tratado como um novo arquivo vazio. Appendupdate: Abra um arquivo para atualização (tanto para entrada quanto para saída) com todas as operações de saída que escrevem dados no final do arquivo. As operações de reposicionamento (fseek. Fsetpos. Remwind) afetam as próximas operações de entrada, mas as operações de saída movem a posição de volta ao final do arquivo. O arquivo é criado se não existir. Com os especificadores de modo acima, o arquivo está aberto como um arquivo de texto. Para abrir um arquivo como um arquivo binário. Um caractere b deve ser incluído na seqüência de modo. Este caractere B adicional pode ser anexado no final da string (fazendo assim os seguintes modos compostos: rb, wb, ab, rb, wb, ab) ou seja inserido entre a letra e o sinal para os modos mistos (rb, Wb, ab). O novo padrão C (C2011, que não faz parte de C) adiciona uma nova subespecificadora padrão (x), que pode ser anexada a qualquer especificador w (para formar wx. Wbx. Wx ou wbxwbx). Este sub-especificador força a função a falhar se o arquivo existe, em vez de substituí-lo. Se os caracteres adicionais seguem a seqüência, o comportamento depende da implementação da biblioteca: algumas implementações podem ignorar caracteres adicionais, de modo que, por exemplo, um t adicional (às vezes usado para indicar explicitamente um arquivo de texto) é aceito. Em algumas implementações de biblioteca, abrir ou criar um arquivo de texto com modo de atualização pode tratar o fluxo em vez disso como um arquivo binário. Os arquivos de texto são arquivos que contêm sequências de linhas de texto. Dependendo do ambiente onde o aplicativo é executado, pode ocorrer alguma conversão de caracteres especiais nas operações de saída de entrada no modo de texto para adaptá-las a um formato de arquivo de texto específico do sistema. Embora em alguns ambientes não ocorram conversões, tanto os arquivos de texto quanto os arquivos binários são tratados da mesma maneira, usando o modo apropriado melhora a portabilidade. Para os arquivos abertos para atualização (aqueles que incluem um sinal), em que as operações de entrada e saída são permitidas, o fluxo deve ser descarregado (fflush) ou reposicionado (fseek. Fsetpos. Rewind) antes de uma operação de leitura que segue uma operação de escrita. O fluxo deve ser reposicionado (fseek. Fsetpos. Rebobinar) antes de uma operação de escrita que segue uma operação de leitura (sempre que essa operação não atingiu o final do arquivo). Valor de retorno Se o arquivo for aberto com êxito, a função retorna um ponteiro para um objeto FILE que pode ser usado para identificar o fluxo em operações futuras. Caso contrário, um ponteiro nulo é retornado. Na maioria das implementações da biblioteca, a variável errno também é definida como um código de erro específico do sistema em caso de falha.

No comments:

Post a Comment