Wednesday 20 June 2018

Opções binárias de freopen stdout


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 em 23:01

No comments:

Post a Comment