Freopen stdout binary options
De acordo com POSIX (veja seção de uso de aplicativo), freopen foi originalmente adicionado a C para facilitar a mudança stdin e stdout para modo binário. Eu suspeito que se você cavar através dos documentos de racionalidade ANSI / ISO você pode encontrar apoio para essa declaração. Como documentos POSIX, este uso é inútil em sistemas POSIX (onde texto e modo binário são obrigados a se comportar de forma idêntica) e realmente prejudicial devido a um bug na especificação que leva a truncamento arquivo se seguidos estritamente. Quanto aos usos práticos, aqui estão alguns que eu posso pensar: substituindo stdin. Stdout. E stderr antes de executar programas externos - mas não é claro para mim se POSIX requer freopen para reutilizar o mesmo número de descritor de arquivo como o arquivo original tinha ou não, então Im não tenho certeza isso é garantido para trabalhar. Eu sempre simplesmente uso aberto e dup2 para esta finalidade. Uma biblioteca de registro que leva um arquivo do chamador pode usar freopen para colocá-lo em modo de anexar para garantir todos os dados são escritos no final, mesmo se outro programa escreve para o arquivo de log. Se youve já passou ao redor e armazenado ponteiros FILE para um número de componentes em seu programa e você encontrar-se mais tarde a necessidade de suportar trocar o arquivo (por exemplo, a rotação log vem à mente), freopen é muito mais fácil do que rastrear em todos os lugares ARQUIVO foi armazenado e hacking em código para atualizar cada instância ou embrulhar o arquivo em sua própria estrutura que permite que você trocá-lo. A utilidade de todos estes é limitada pelo mau comportamento ou freopen em caso de falha o arquivo torna-se inválido e irrecuperável, por isso, se qualquer parte do programa ainda pode usá-lo, você tem que encontrar uma maneira de evitar mais acesso ou sair imediatamente. Da mesma forma, freopen não é thread-safe pela mesma razão se ele falhar, acessando o arquivo de qualquer outro thread resulta em comportamento indefinido. Respondeu Nov 12 10 at 22:37 No - freopen () não é redundante. Ele permite que você abra um arquivo como entrada padrão, por exemplo, que de outra forma você não poderia confiar em alcançar. Se você tem que chamar uma função (para a qual você não tem o código fonte, então você não pode corrigi-lo) que lê em um fluxo de arquivo particular (normalmente entrada padrão) ou escreve em um fluxo de arquivo particular (normalmente saída padrão), mas você não Quer a função para ler ou escrever para o arquivo que está conectado lá no seu programa, então você pode usar freopen () para corrigir as coisas para que a função vê o que ele espera, mas recebe as informações de onde você quer - ou escreve onde você quer. Resposta Vovanium: se você pode especificar o fluxo porque o código chamado usa fprintf () no fluxo que você entrega, em vez de printf (). Então não há nenhuma razão para usar freopen (). Em 25 anos de programação C, eu não acho que usei freopen () mais do que um par de vezes, se isso. Como R. assinalou, se você quiser fazer coisas como redefinir a saída padrão de volta ao seu arquivo original depois que o redirecionamento estiver completo, você abandona o escopo do padrão C em território POSIX e usa descritores de arquivo. Por exemplo, fdopen () cria um fluxo para um descritor de arquivo que eu usei bastante freqüentemente. Ndash Jonathan Leffler Nov 12 10 at 23: 01A 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 é padronizado. Em algumas implementações, fazer um freopen no stdout pode mudar o modo, embora eu acho que formalmente, isso é proibido em C. (É implementação definida em C.) E, aparentemente, não funciona em sua implementação. Você é a melhor aposta é descobrir como seu sistema nomeia o dispositivo de console (/ dev / tty sob UNIX CONS. Eu acho que, em Windows), abri-lo no modo desejado e saída para ele. Em Puente não só queremos que os nossos alunos tenham sucesso académico mas também socialmente, por isso incentivamos os nossos alunos a reinventar-se, desafiando-os a sair de suas zonas de conforto E se tornam líderes. Uma maneira eficaz tem sido fazer os alunos de Puente mais responsáveis pelos esforços de angariação de fundos dos programas. Como tal, durante as vendas de bolos nossos alunos são responsáveis por chegar cedo para montar, trazendo produtos cozidos, organizando bens, estabelecendo preços razoáveis, vendendo produtos assados e guardando os bens e / ou equipamentos não vendidos usados. A cada semestre programamos pelo menos duas ou três vendas de bolos, uma lavagem de carros (sempre que possível) e dois desenhos de oportunidade. O resultado é notável não só no ganho financeiro, mas sobretudo no crescimento pessoal. Nossos alunos amadurecem, tornam-se mais confiantes, demonstram qualidades de liderança e desenvolvem um laço mais forte com cada outra família, como a conexão com seus pares de Puente. Clique aqui se você quiser contribuir para Puente. Copiar 2017 Los Angeles Trade Technical College Todos os direitos reservados 400 West Washington Blvd, Los Angeles CA 90015 Telefone (213) 763-7000 Fax (213) 763-5393freopen, wfreopen Cada uma dessas funções retorna um ponteiro para o arquivo recém-aberto. Se ocorrer um erro, o ficheiro original é fechado ea função devolve um valor de ponteiro NULL. Se caminho. Modo. Ou fluxo é um ponteiro nulo, ou se filename é uma seqüência de caracteres vazia, essas funções chamar o manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução é permitida continuar, estas funções definem errno para EINVAL e retornam NULL. Consulte doserrno, errno, syserrlist e sysnerr para obter mais informações sobre estes e outros códigos de erro. Existem versões mais seguras dessas funções, veja freopens, wfreopens. A função freopen fecha o arquivo atualmente associado ao fluxo e reatribui o fluxo ao arquivo especificado pelo caminho. Wfreopen é uma versão de caracteres largos de freopen os argumentos de caminho e modo para wfreopen são strings de caracteres largos. Wfreopen e freopen se comportam de forma idêntica em contrário. Generic-Text Routine Mappings freopen é normalmente usado para redirecionar os arquivos pré-abertos stdin. Stdout. E stderr para arquivos especificados pelo usuário. O novo arquivo associado ao fluxo é aberto com modo, que é uma seqüência de caracteres especificando o tipo de acesso solicitado para o arquivo, da seguinte forma: Abre para leitura. Se o arquivo não existir ou não puder ser encontrado, a chamada freopen falhará. Abre um arquivo vazio para gravação. Se o arquivo determinado existir, seu conteúdo será destruído. Abre-se para escrever no final do arquivo (anexando) sem remover o marcador EOF antes de gravar novos dados para o arquivo cria o arquivo primeiro se ele não existir. Abre para ler e escrever. (O arquivo deve existir.) Abre um arquivo vazio para leitura e escrita. Se o arquivo determinado existir, seu conteúdo será destruído. Abre para leitura e anexando a operação de inclusão inclui a remoção do marcador EOF antes de novos dados é gravado para o arquivo eo marcador EOF é restaurado após a escrita é concluída cria o arquivo primeiro se ele não existir. Use os tipos w e w com cuidado, pois eles podem destruir arquivos existentes. Quando um arquivo é aberto com a ou um tipo de acesso, todas as operações de gravação ocorrem no final do arquivo. Embora o ponteiro de arquivo possa ser reposicionado usando fseek ou rebobinar. O ponteiro de arquivo sempre é movido de volta para o final do arquivo antes de qualquer operação de gravação é executada. Assim, os dados existentes não podem ser sobrescritos. O modo a não remove o marcador EOF antes de anexar ao arquivo. Após a anexação ocorreu, o comando TYPE MS-DOS mostra apenas dados até o marcador EOF original e não quaisquer dados acrescentados ao ficheiro. O modo a remove o marcador EOF antes de anexar ao arquivo. Após anexar, o comando TYPE do MS-DOS mostra todos os dados no arquivo. O modo a é necessário para anexar a um arquivo de fluxo que é terminado com o marcador CTRLZ EOF. Quando o r. W . Ou um tipo de acesso é especificado, tanto leitura e escrita são permitidos (o arquivo é dito para ser aberto para atualização). No entanto, quando você alternar entre leitura e escrita, deve haver um fsetpos intervenientes. Fseek Ou operação de rebobinamento. A posição atual pode ser especificada para a operação fsetpos ou fseek, se desejado. Além dos valores acima, um dos seguintes caracteres pode ser incluído na seqüência de modo para especificar o modo de tradução para novas linhas. Abrir no texto (traduzido) as combinações de retorno do canal de retorno do carro (CR-LF) são convertidas em caracteres de avanço simples (LF) na entrada. Os caracteres LF são convertidos em combinações CR-LF na saída. Além disso, CTRLZ é interpretado como um caractere de fim de arquivo na entrada. Em arquivos abertos para leitura ou para escrever e ler com. A biblioteca de tempo de execução verifica um CTRLZ no final do arquivo e remove-lo, se possível. Isso é feito porque usar fseek e ftell para mover dentro de um arquivo pode causar fseek para se comportar incorretamente perto do final do arquivo. A opção t é uma extensão da Microsoft que não deve ser utilizada onde a portabilidade ANSI é desejada. Abrir no modo binário (não traduzido) as traduções acima são suprimidas. Se t ou b não é dado no modo. O modo de tradução padrão é definido pela variável global fmode. Se t ou b é prefixado para o argumento, a função falha e retorna NULL. Para uma discussão de texto e modos binários, consulte Texto e modo binário Arquivo E / S. fopen, wfopen A função fopen abre o arquivo que é especificado pelo nome do arquivo. Por padrão, uma seqüência de caracteres de nome de arquivo estreita é interpretada usando a página de código ANSI (CPACP). Em aplicativos de área de trabalho do Windows isso pode ser alterado para a página de código OEM (CPOEMCP) usando a função SetFileApisToOEM. Você pode usar a função AreFileApisANSI para determinar se o nome do arquivo é interpretado usando o ANSI ou a página de código OEM padrão do sistema. Wfopen é uma versão de caracteres largos de fopen os argumentos para wfopen são strings de caracteres largos. Caso contrário, wfopen e fopen se comportam de forma idêntica. Basta usar wfopen não afeta o conjunto de caracteres codificado que é usado no fluxo de arquivos. Fopen aceita caminhos que são válidos no sistema de arquivos no ponto de execução fopen aceita caminhos UNC e caminhos que envolvem unidades de rede mapeadas, desde que o sistema que executa o código tenha acesso ao compartilhamento ou unidade mapeada no momento da execução. Quando você constrói caminhos para fopen. Certifique-se de que unidades, caminhos ou compartilhamentos de rede estarão disponíveis no ambiente de execução. Você pode usar barras oblíquas (/) ou barras invertidas () como separadores de diretório em um caminho. Verifique sempre o valor de retorno para ver se o ponteiro é NULL antes de efectuar quaisquer operações adicionais no ficheiro. Se ocorrer um erro, a variável global errno é definida e pode ser usada para obter informações de erro específicas. Para obter mais informações, consulte errno, doserrno, syserrlist e sysnerr. Fopen suporta fluxos de arquivos Unicode. Para abrir um arquivo Unicode, passe um sinalizador ccs que especifique a codificação desejada para fopen. do seguinte modo. FILE fp fopen (newfile. txt, rt, ccsencoding) Quando um arquivo é aberto no modo Unicode, as funções de entrada traduzem os dados lidos do arquivo em dados UTF-16 armazenados como tipo wchart. Funções que gravam em um arquivo aberto no modo Unicode esperam buffers que contêm dados UTF-16 armazenados como wchart de tipo. Se o arquivo é codificado como UTF-8, os dados UTF-16 são convertidos em UTF-8 quando ele é gravado e os arquivos UTF-8-codificado conteúdo é traduzido em UTF-16 quando ele é lido. Uma tentativa para ler ou escrever um número ímpar de bytes no modo Unicode causa um erro de validação de parâmetro. Para ler ou gravar dados armazenados em seu programa como UTF-8, use um modo de arquivo de texto ou binário em vez de um modo Unicode. Você é responsável por qualquer tradução de codificação necessária. Se o arquivo já existir e for aberto para leitura ou anexação, a marca de ordem de bytes (BOM), se ela estiver presente no arquivo, determina a codificação. A codificação BOM tem precedência sobre a codificação que é especificada pelo sinalizador ccs. A codificação ccs é usada somente quando não há BOM presente ou o arquivo é um novo arquivo. A detecção da lista de materiais aplica-se apenas a arquivos que são abertos no modo Unicode (ou seja, passando o sinalizador ccs). A tabela a seguir resume os modos que são usados para vários sinalizadores ccs dados para fopen e Byte Order Marks no arquivo. Codificações usadas Baseado em ccs Flag e BOM Os arquivos abertos para gravação no modo Unicode têm uma BOM gravada automaticamente. Se mode é a, ccsltencodinggt, fopen primeiro tenta abrir o arquivo usando o acesso de leitura e gravação. Se isso for bem-sucedido, a função lê a BOM para determinar a codificação para o arquivo se isso falhar, a função usa a codificação padrão para o arquivo. Em ambos os casos, fopen irá reabrir o arquivo usando o acesso somente de gravação. (Isto aplica-se apenas a um modo, não a um modo.) Mapeamentos de rotina de texto genérico UNICODE amp MBCS não definido O modo de cadeia de caracteres especifica o tipo de acesso que é pedido para o ficheiro, da seguinte forma. Abre para leitura. Se o arquivo não existir ou não puder ser encontrado, a chamada fopen falhará. Abre um arquivo vazio para gravação. Se o arquivo determinado existir, seu conteúdo será destruído. Abre para escrever no final do arquivo (anexando) sem remover o marcador de fim de arquivo (EOF) antes de novos dados são gravados no arquivo. Cria o arquivo se ele não existir. Abre para ler e escrever. O arquivo deve existir. Abre um arquivo vazio para leitura e escrita. Se o arquivo existir, seu conteúdo será destruído. Abre para leitura e anexação. A operação de anexação inclui a remoção do marcador EOF antes de novos dados são gravados no ficheiro. O marcador EOF não é restaurado após a conclusão da escrita. Cria o arquivo se ele não existir. Quando um arquivo é aberto usando o tipo de acesso a ou o tipo de acesso, todas as operações de gravação ocorrem no final do arquivo. O ponteiro de arquivo pode ser reposicionado usando fseek ou rebobinar. Mas é sempre movido de volta para o final do arquivo antes de qualquer operação de gravação é executada. Portanto, os dados existentes não podem ser sobrescritos. O modo a não remove o marcador EOF antes de anexar ao arquivo. Após a anexação ocorreu, o comando TYPE MS-DOS mostra apenas dados até o marcador EOF original e não quaisquer dados acrescentados ao ficheiro. Antes de anexar ao arquivo, o modo a remove o marcador EOF. Após anexar, o comando TYPE do MS-DOS mostra todos os dados no arquivo. O modo a é necessário para anexar a um arquivo de fluxo que é terminado com o marcador CTRLZ EOF. Quando o r. W . Ou um tipo de acesso é especificado, tanto a leitura como a escrita são ativadas (o arquivo é dito estar aberto para atualização). No entanto, quando você alterna de leitura para escrita, a operação de entrada deve encontrar um marcador EOF. Se não houver EOF, você deve usar uma chamada intermediária para uma função de posicionamento de arquivos. As funções de posicionamento do arquivo são fsetpos. Fseek E rebobinar. Quando você alterna de gravação para leitura, você deve usar uma chamada intermediária para fflush ou para uma função de posicionamento de arquivo. Além dos valores anteriores, os seguintes caracteres podem ser acrescentados ao modo para especificar o modo de conversão para caracteres de nova linha. Abrir no modo de texto (traduzido). Neste modo, CTRLZ é interpretado como um carácter EOF na entrada. Em arquivos abertos para leitura / gravação usando um arquivo. Fopen verifica uma CTRLZ no final do arquivo e remove-lo, se for possível. Isso é feito porque usando fseek e ftell para mover dentro de um arquivo que termina com CTRLZ pode causar fseek para se comportar incorretamente perto do final do arquivo. No modo de texto, as combinações de retorno de linha de retorno de carro são convertidas em alimentação de linha única na entrada e os caracteres de alimentação de linha são convertidos para combinações de retorno de linha de retorno na saída. Quando uma função Unicode stream-I / O opera no modo de texto (o padrão), o fluxo de origem ou de destino é assumido como uma seqüência de caracteres de vários bytes. Portanto, as funções Unicode fluxo-entrada converter caracteres multibyte para caracteres largos (como se por uma chamada para a função mbtowc). Pela mesma razão, as funções de saída de fluxo Unicode convertem caracteres largos em caracteres de vários bytes (como se por uma chamada para a função wctomb). Abrir em conversões de modo binário (não traduzido) envolvendo caracteres de retorno de carro e alimentação de linha são suprimidos. Se t ou b não é dado no modo. O modo de tradução padrão é definido pela variável global fmode. Se t ou b é prefixado para o argumento, a função falha e retorna NULL. Para obter mais informações sobre como usar modos de texto e binário em Unicode e fluxo contínuo de E / S multibyte, consulte Arquivo de modo binário e de texto I-O e Unicode Stream I-O em modos texto e binário. Ative o sinalizador de confirmação para o nome do arquivo associado para que o conteúdo do buffer de arquivo seja gravado diretamente no disco se fflush ou flushall for chamado. Redefinir o sinalizador de confirmação para o nome do arquivo associado para não-commit. Esse é o padrão. Também substitui o sinalizador de confirmação global se ligar o programa com COMMODE. OBJ. O padrão global de commit flag é no-commit, a menos que você vincule explicitamente o seu programa com COMMODE. OBJ (consulte Link Options). Especifica que o arquivo não é herdado por processos filho. Especifica que o cache é otimizado para, mas não restrito a, acesso seqüencial a partir do disco. Especifica que o cache é otimizado para, mas não restrito a, acesso aleatório a partir do disco. Especifica um arquivo como temporário. Se possível, não é liberado para o disco. Especifica um arquivo como temporário. Ele é excluído quando o último ponteiro de arquivo é fechado. Especifica o conjunto de caracteres codificados para usar (UTF-8, UTF-16LE ou UNICODE) para este arquivo. Não especifique se você deseja a codificação ANSI. Caracteres válidos para a seqüência de modo que é usada em fopen e fdopen correspondem aos argumentos oflag que são usados em aberto e sopen. do seguinte modo. Caracteres na seqüência de caracteres de modo
Comments
Post a Comment