freopen
, _wfreopen
Ponownie przypisuje wskaźnik pliku. Dostępne są bezpieczniejsze wersje funkcji; zobacz freopen_s
, _wfreopen_s
.
Składnia
FILE *freopen(
const char *path,
const char *mode,
FILE *stream
);
FILE *_wfreopen(
const wchar_t *path,
const wchar_t *mode,
FILE *stream
);
Parametry
path
Ścieżka nowego pliku.
mode
Typ dozwolonego dostępu.
stream
Wskaźnik do FILE
struktury.
Wartość zwracana
Każda z tych funkcji zwraca wskaźnik do nowo otwartego pliku. Jeśli wystąpi błąd, oryginalny plik zostanie zamknięty, a funkcja zwróci NULL
wartość wskaźnika. Jeśli path
element , mode
lub stream
jest wskaźnikiem o wartości null lub jest filename
pustym ciągiem, te funkcje wywołują nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, te funkcje są ustawione errno
na EINVAL
i zwracają wartość NULL
.
Aby uzyskać więcej informacji na temat kodów błędów, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Istnieją bardziej bezpieczne wersje tych funkcji, zobacz freopen_s
, _wfreopen_s
.
Funkcja freopen
zamyka plik aktualnie skojarzony z plikiem stream
i ponownie przypisuje stream
go do pliku określonego przez path
polecenie . _wfreopen
jest wersją wieloznakową ; _freopen
path
argumenty i mode
to _wfreopen
ciągi szerokoznakowe. _wfreopen
i _freopen
zachowywać się identycznie inaczej.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Mapowania procedur tekstu ogólnego
TCHAR.H rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_tfreopen |
freopen |
freopen |
_wfreopen |
freopen
Jest zwykle używany do przekierowywania wstępnie otwartych plików stdin
, stdout
i stderr
do plików określonych przez użytkownika. Nowy plik skojarzony z stream
programem jest otwierany z mode
ciągiem znaków określającym typ dostępu żądanego dla pliku w następujący sposób:
mode |
Access |
---|---|
"r" |
Otwiera plik do czytania. Jeśli plik nie istnieje lub nie można go odnaleźć, freopen wywołanie nie powiedzie się. |
"w" |
Otwiera pusty plik do zapisu. Jeśli dany plik istnieje, jego zawartość zostanie zniszczona. |
"a" |
Otwiera plik do zapisu na końcu pliku (dołączanie) bez usuwania znacznika końca pliku (EOF), zanim nowe dane są zapisywane w pliku. Tworzy plik, jeśli nie istnieje. |
"r+" |
Otwiera plik zarówno do czytania, jak i zapisu. Plik musi istnieć. |
"w+" |
Otwiera pusty plik do odczytu i zapisu. Jeśli plik istnieje, jego zawartość zostanie zniszczona. |
"a+" |
Otwiera plik do odczytu i dołączania. Operacja dołączania obejmuje usunięcie znacznika EOF przed zapisaniem nowych danych w pliku. Znacznik EOF nie jest przywracany po zakończeniu pisania. Tworzy plik, jeśli nie istnieje. |
Używaj typów "w"
i "w+"
z rozwagą, ponieważ mogą zniszczyć istniejące pliki. Począwszy od C11, można dołączyć "x"
do "w"
funkcji lub "w+"
spowodować niepowodzenie funkcji, jeśli plik istnieje, zamiast zastępować go.
Po otwarciu "a"
pliku z typem dostępu lub "a+"
wszystkie operacje zapisu odbywają się na końcu pliku. Mimo że wskaźnik pliku może być zmieniany przy użyciu polecenia fseek
lub rewind
, wskaźnik pliku jest zawsze przenoszony z powrotem na koniec pliku przed przeprowadzeniem dowolnej operacji zapisu. W związku z tym istniejące dane nie mogą być zastępowane.
Tryb "a"
nie usuwa znacznika EOF przed dołączeniem do pliku. Po dołączeniu polecenie MS-DOS TYPE wyświetla tylko dane do oryginalnego znacznika EOF, a nie żadne dane dołączone do pliku. Tryb "a+"
usuwa znacznik EOF przed dołączeniem do pliku. Po dołączeniu polecenie MS-DOS TYPE wyświetla wszystkie dane w pliku. Tryb "a+"
jest wymagany do dołączania do pliku strumienia zakończonego znacznikiem CTRL+Z EOF.
Po określeniu "r+"
typu , "w+"
lub "a+"
dostępu zarówno odczyt, jak i zapis są dozwolone (plik jest podobno otwarty dla "aktualizacji"). Jednak w przypadku przełączania się między odczytem i zapisem musi istnieć interweniowanie fsetpos
operacji , fseek
lub rewind
. Bieżące położenie można określić dla fsetpos
operacji lub fseek
, jeśli chcesz. Oprócz powyższych wartości jeden z następujących znaków może być uwzględniony w mode
ciągu, aby określić tryb tłumaczenia dla nowych wierszy.
mode Modyfikator |
Tryb tłumaczenia |
---|---|
t |
Otwórz w trybie tekstowym (przetłumaczonym). |
b |
Otwórz w trybie binarnym (nieprzetłumaczonym); tłumaczenia obejmujące znaki powrotu karetki i znaków kanału informacyjnego wiersza są pomijane. |
W trybie tekstowym (przetłumaczonym) kombinacje zestawienia powrotu karetki (CR-LF) są tłumaczone na znaki jednowierszowego kanału informacyjnego (LF) w danych wejściowych; Znaki LF są tłumaczone na kombinacje CR-LF w danych wyjściowych. Ponadto CTRL+Z są interpretowane jako znak końca pliku w danych wejściowych. W plikach otwartych do odczytu lub zapisu i odczytywania za pomocą "a+"
polecenia biblioteka czasu wykonywania sprawdza, czy na końcu pliku nie ma CTRL+Z i usuwa go, jeśli jest to możliwe. Jest on usuwany, ponieważ użycie polecenia fseek
i ftell
do przeniesienia w pliku może spowodować fseek
nieprawidłowe zachowanie na końcu pliku. Nie używaj t
tej opcji, jeśli chcesz przenośność ansi, ponieważ jest to rozszerzenie firmy Microsoft.
Jeśli t
wartość lub b
nie jest podana w programie mode
, domyślny tryb tłumaczenia jest definiowany przez zmienną globalną _fmode
. Jeśli t
argument lub b
jest poprzedzony prefiksem, funkcja kończy się niepowodzeniem i zwraca wartość NULL
.
Aby zapoznać się z omówieniem trybów tekstowych i binarnych, zobacz Tekst i tryb binarny we/wy pliku.
Wymagania
Function | Wymagany nagłówek |
---|---|
freopen |
<stdio.h> |
_wfreopen |
<stdio.h> lub <wchar.h> |
Konsola nie jest obsługiwana w aplikacjach platformy platforma uniwersalna systemu Windows (UWP). Standardowe dojścia strumienia skojarzone z konsolą programu stdin
, stdout
i i stderr
muszą zostać przekierowane, zanim funkcje czasu wykonywania języka C będą mogły ich używać w aplikacjach platformy UWP. Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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'
Zobacz też
We/Wy strumienia
fclose
, _fcloseall
_fdopen
, _wfdopen
_fileno
fopen
, _wfopen
_open
, _wopen
_setmode