Udostępnij za pośrednictwem


freopen_s, _wfreopen_s

Zamyka plik aktualnie skojarzony z plikiem oldStream i ponownie przypisuje stream go do pliku określonego przez fileNamepolecenie .

Te wersje programu freopen _wfreopenmają 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_errlisti _sys_nerr.

Uwagi

Funkcja freopen_s jest zwykle używana do dołączania wstępnie otwartych strumieni skojarzonych z elementem stdini 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 pathpolecenie . _wfreopen_sjest wersją wieloznakową ; freopen_spath 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 NULLmodelub 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, stdouti stderr do plików określonych przez użytkownika. Nowy plik skojarzony z stream programem jest otwierany z modecią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 fsetposoperacji , fseeklub 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, stdouti i stderrmuszą 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