freopen
, _wfreopen
Reatribui um ponteiro de arquivo. Versões mais seguras das funções estão disponíveis; veja freopen_s
, _wfreopen_s
.
Sintaxe
FILE *freopen(
const char *path,
const char *mode,
FILE *stream
);
FILE *_wfreopen(
const wchar_t *path,
const wchar_t *mode,
FILE *stream
);
Parâmetros
path
Caminho do novo arquivo.
mode
Tipo de acesso permitido.
stream
Ponteiro para a estrutura FILE
.
Valor retornado
Cada uma dessas funções retorna um ponteiro para o arquivo recém-aberto. Se ocorrer um erro, o arquivo original será fechado e a função retornará um NULL
valor de ponteiro. Se path
, mode
, ou stream
for um ponteiro nulo ou se filename
for uma cadeia de caracteres vazia, essas funções invocarão o manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, essas funções definirão errno
como EINVAL
e retornarão NULL
.
Para obter mais informações sobre códigos de erro, consulte errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Comentários
Existem versões mais seguras dessas funções, consulte freopen_s
, _wfreopen_s
.
A freopen
função fecha o arquivo atualmente associado stream
e reatribui stream
ao arquivo especificado por path
. _wfreopen
é uma versão de caractere largo de _freopen
; os argumentos path
e mode
para _wfreopen
são cadeias de caracteres largos. Caso contrário, _wfreopen
e _freopen
se comportam de forma idêntica.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Mapeamentos de rotina de texto genérico
Rotina TCHAR.H |
_UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tfreopen |
freopen |
freopen |
_wfreopen |
freopen
normalmente é usado para redirecionar os arquivos abertos previamente stdin
, stdout
e stderr
para arquivos especificados pelo usuário. O novo arquivo associado é stream
aberto com mode
, que é uma cadeia de caracteres que especifica o tipo de acesso solicitado para o arquivo, da seguinte maneira:
mode |
Access |
---|---|
"r" |
Abre para leitura. Se o arquivo não existir ou não puder ser encontrado, a chamada freopen falhará. |
"w" |
Abre um arquivo vazio para gravação. Se o arquivo determinado existir, seus conteúdos são destruídos. |
"a" |
Abre para gravação no fim do arquivo (conexão) sem remover o marcador de EOF (Fim de arquivo) antes de novos dados serem gravados no arquivo. Cria o arquivo se ele não existir. |
"r+" |
Abre para leitura e gravação. O arquivo deve existir. |
"w+" |
Abre um arquivo vazio para leitura e gravação. Se o arquivo existir, seus conteúdos são destruídos. |
"a+" |
Abre para leitura e conexão. A operação de conexão inclui a remoção do marcador de EOF antes de os novos dados serem gravados no arquivo. O marcador de EOF não é restaurado após a gravação ser concluída. Cria o arquivo se ele não existir. |
Use os tipos "w"
e "w+"
com cuidado, pois eles podem destruir arquivos existentes. Começando com C11, você pode acrescentar "x"
a "w"
ou "w+"
para causar falha na função se o arquivo existir, em vez de substituí-lo.
Quando um arquivo é aberto com o tipo de acesso "a"
ou "a+"
, todas as operações de gravação ocorrem no fim do arquivo. Embora o ponteiro do arquivo possa ser reposicionado usando fseek
ou rewind
, o ponteiro do arquivo é sempre movido de volta para o final do arquivo antes que qualquer operação de gravação seja executada. Portanto, os dados existentes não podem ser substituídos.
O modo "a"
não remove o marcador de EOF antes de ser acrescentado ao arquivo. Depois de a conexão ter ocorrido, o comando MS-DOS TYPE só mostra dados até o marcador de EOF original, e não qualquer dado anexado ao arquivo. O modo "a+"
remove o marcador de EOF antes de ser acrescentado ao arquivo. Depois de anexar, o comando MS-DOS TYPE mostra todos os dados no arquivo. O modo "a+"
é exigido para conexão com um arquivo de fluxo terminado com o marcador de EOF CTRL+Z.
Quando o tipo de acesso "r+"
, "w+"
ou "a+"
é especificado, são permitidas leitura e gravação (diz-se que o arquivo está aberto para "atualização"). No entanto, quando você muda entre leitura e gravação, precisa haver uma operação fsetpos
, fseek
ou rewind
intermediária. A posição atual pode ser especificada para a operação fsetpos
ou fseek
, se quiser. Além dos valores acima, um dos caracteres seguintes pode ser incluído na cadeia de caracteres mode
para especificar o modo de conversão para novas linhas.
Modificador mode |
Modo de conversão |
---|---|
t |
Abra no modo de texto (convertido). |
b |
Abra em um modo binário (não convertido); as conversões envolvendo caracteres de retorno de carro e avanço de linha são suprimidas. |
No modo de texto (convertido), combinações de CR-LF (retorno de carro – avanço de linha) são convertidas em caracteres de LF (avanço de linha) simples na entrada; caracteres de LF são convertidos em combinações de CR-LF na saída. Além disso, CTRL+Z é interpretado como um caractere de fim do arquivo na entrada. Em arquivos abertos para leitura ou para leitura e gravação com "a+"
, a biblioteca em tempo de execução verifica se há um CTRL+Z no fim do arquivo e o remove, se possível. Ele é removido porque usar fseek
e mover dentro de um arquivo pode fazer com que fseek
você se comporte ftell
de maneira inadequada perto do final do arquivo. Não use a opção t
se quiser portabilidade ANSI porque é uma extensão da Microsoft.
Se t
ou b
não for fornecido em mode
, o modo de conversão padrão será definido pela variável global _fmode
. Se t
ou b
for prefixado para o argumento, a função falha e retorna NULL
.
Para saber mais sobre os modos de texto e binário, consulte E/S de texto e arquivo de modo binário.
Requisitos
Função | Cabeçalho necessário |
---|---|
freopen |
<stdio.h> |
_wfreopen |
<stdio.h> ou <wchar.h> |
Não há suporte para o console em aplicativos UWP (Plataforma Universal do Windows). Os identificadores de fluxo padrão associados ao console, stdin
, stdout
e stderr
, devem ser redirecionados antes que as funções em tempo de execução C possam usá-los em aplicativos UWP. Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// crt_freopen.c
// compile with: /W3
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.
#include <stdio.h>
#include <stdlib.h>
FILE *stream;
int main( void )
{
// Reassign "stderr" to "freopen.out":
stream = freopen( "freopen.out", "w", stderr ); // C4996
// Note: freopen is deprecated; consider using freopen_s instead
if( stream == NULL )
fprintf( stdout, "error on freopen\n" );
else
{
fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );
fprintf( stream, "This will go to the file 'freopen.out'\n" );
fclose( stream );
}
system( "type freopen.out" );
}
successfully reassigned
This will go to the file 'freopen.out'
Confira também
E/S de fluxo
fclose
, _fcloseall
_fdopen
, _wfdopen
_fileno
fopen
, _wfopen
_open
, _wopen
_setmode