freopen_s
, _wfreopen_s
Zamyka plik aktualnie skojarzony z plikiem oldStream
i ponownie przypisuje stream
go do pliku określonego przez fileName
polecenie .
Te wersje programu freopen
_wfreopen
mają ulepszenia zabezpieczeń zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.
Składnia
errno_t freopen_s(
FILE ** stream,
const char * fileName,
const char * mode,
FILE* oldStream
);
errno_t _wfreopen_s(
FILE ** stream,
const wchar_t * fileName,
const wchar_t * mode,
FILE * oldStream
);
Parametry
stream
Parametr out, który wskaże ponownie otwarty strumień po powrocie funkcji.
fileName
Ścieżka pliku do ponownego otwarcia.
mode
Tryb ponownego otwarcia strumienia.
oldStream
Strumień do ponownego otwarcia. Jest opróżniany i wszystkie skojarzone z nim pliki są zamknięte.
Wartość zwracana
Zero w przypadku powodzenia; w przeciwnym razie kod błędu. Jeśli wystąpi błąd, oryginalny plik jest zamknięty i NULL
jest zapisywany, stream
chyba że stream
jest również NULL
Aby uzyskać więcej informacji na temat kodów błędów, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcja freopen_s
jest zwykle używana do dołączania wstępnie otwartych strumieni skojarzonych z elementem stdin
i stdout
stderr
do innego pliku.
Funkcja freopen_s
zamyka plik aktualnie skojarzony z plikiem stream
i ponownie przypisuje stream
go do pliku określonego przez path
polecenie . _wfreopen_s
jest wersją wieloznakową ; freopen_s
path
argumenty i mode
to _wfreopen_s
ciągi szerokoznakowe. _wfreopen_s
i freopen_s
zachowywać się identycznie inaczej.
Jeśli którykolwiek z pFile
, path
, , stream
NULL
mode
lub path
jest 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ść EINVAL
.
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_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s
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_s 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
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_s |
<stdio.h> |
_wfreopen_s |
<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_s.c
// 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 )
{
errno_t err;
// Reassign "stderr" to "freopen.out":
err = freopen_s( &stream, "freopen.out", "w", stderr );
if( err != 0 )
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ż
Stream I/O
freopen
, _wfreopen
fclose
, _fcloseall
_fdopen
, _wfdopen
_fileno
fopen
, _wfopen
_open
, _wopen
_setmode