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 pathelement , modelub 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_errlisti _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 pathpolecenie . _wfreopenjest wersją wieloznakową ; _freopenpath 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 Rutynowych _UNICODE i _MBCS niezdefiniowane _MBCS Zdefiniowane _UNICODE Zdefiniowane
_tfreopen freopen freopen _wfreopen

freopen 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 Uzyskaj dostęp
"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 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 klawisze 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 klawiszy 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, 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.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