freopen_s
, _wfreopen_s
Zavře soubor, který je aktuálně přidružený, oldStream
a znovu přiřazuje stream
k souboru určenému uživatelem fileName
.
Tyto verze freopen
mají _wfreopen
vylepšení zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.
Syntaxe
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
Výstupní parametr, který bude odkazovat na znovu otevřenou stream, když funkce vrátí.
fileName
Cesta k souboru, který se má znovu otevřít.
mode
Režim znovu otevřeného datového proudu.
oldStream
Stream, který se má znovu otevřít. Jsou vyprázdněny a všechny soubory, které jsou k němu přidružené, zavřené.
Vrácená hodnota
Nula při úspěchu; jinak kód chyby. Pokud dojde k chybě, původní soubor se zavře a NULL
zapíše se do stream
souboru, pokud stream
není také NULL
Další informace o kódech chyb naleznete v tématu errno
, _doserrno
, _sys_errlist
a _sys_nerr
.
Poznámky
Funkce freopen_s
se obvykle používá k připojení předem otevřených datových proudů přidružených stdin
stdout
k a stderr
k jinému souboru.
Funkce freopen_s
zavře soubor, který je aktuálně přidružený k stream
souboru, a znovu ho přiřazuje stream
k souboru určenému path
. _wfreopen_s
je verze širokého znaku freopen_s
; path
a mode
argumenty, které mají _wfreopen_s
být řetězce širokého znaku. _wfreopen_s
a freopen_s
chovat se stejně jinak.
Pokud některý z pFile
, path
, mode
nebo jsou NULL
, nebo stream
pokud path
je prázdný řetězec, tyto funkce vyvolat neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru. Pokud provádění může pokračovat, tyto funkce jsou nastaveny errno
na EINVAL
a vracet EINVAL
.
Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.
Mapování rutin obecného textu
TCHAR.H rutina |
_UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_tfreopen_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s
se obvykle používá k přesměrování předem otevřených souborů stdin
, stdout
a stderr
na soubory určené uživatelem. Nový soubor přidružený stream
se otevře s řetězcem mode
znaků určujícím typ přístupu požadovaného pro soubor následujícím způsobem:
mode |
Access |
---|---|
"r" |
Otevře se pro čtení. Pokud soubor neexistuje nebo ho nejde najít, freopen_s volání selže. |
"w" |
Otevře prázdný soubor pro zápis. Pokud daný soubor existuje, jeho obsah se zničí. |
"a" |
Otevře se pro zápis na konec souboru (připojování) bez odebrání značky end-of-file (EOF) před zápisem nových dat do souboru. Vytvoří soubor, pokud neexistuje. |
"r+" |
Otevře se pro čtení i zápis. Soubor musí existovat. |
"w+" |
Otevře prázdný soubor pro čtení i zápis. Pokud soubor existuje, jeho obsah se zničí. |
"a+" |
Otevře se pro čtení a připojení. Operace připojení zahrnuje odebrání značky EOF před zápisem nových dat do souboru. Po dokončení zápisu se značka EOF neobnoví. Vytvoří soubor, pokud neexistuje. |
"w"
Tyto typy a "w+"
typy používejte opatrně, protože mohou zničit existující soubory. Počínaje jazykem C11 můžete funkci připojit "x"
"w"
nebo "w+"
způsobit selhání, pokud soubor existuje, a nemusíte ho přepisovat.
Když se soubor otevře s typem "a"
přístupu nebo "a+"
s typem přístupu, proběhnou všechny operace zápisu na konci souboru. I když lze ukazatel souboru přemístit pomocí fseek
nebo rewind
, ukazatel souboru se před provedením jakékoli operace zápisu vždy přesune zpět na konec souboru. Stávající data proto nelze přepsat.
Režim "a"
před připojením k souboru neodebere značku EOF. Po připojení příkaz MS-DOS TYPE zobrazí data pouze do původní značky EOF, a ne žádná data připojená k souboru. Režim "a+"
odebere značku EOF před připojením k souboru. Po připojení příkaz MS-DOS TYPE zobrazí všechna data v souboru. Režim "a+"
se vyžaduje pro připojení k souboru streamu, který je ukončen značkou CTRL+Z EOF.
Je-li "r+"
zadán typ přístupu , "w+"
nebo "a+"
čtení i zápis jsou povoleny (soubor je otevřen pro "aktualizaci"). Při přepínání mezi čtením a zápisem však musí existovat intervening fsetpos
, fseek
nebo rewind
operace. Aktuální pozici lze zadat pro fsetpos
operaci, fseek
pokud chcete. Kromě výše uvedených hodnot může být mode
součástí řetězce jeden z následujících znaků, který určuje režim překladu pro nové řádky.
mode modifikátor |
Režim překladu |
---|---|
t |
Otevřete v textovém (přeloženém) režimu. |
b |
Otevřít v binárním (nepřekláněném) režimu; jsou potlačeny překlady zahrnující znaky návratu na začátek řádku a odřádkování. |
V textovém (přeložené) režimu jsou kombinace návratového řádku řádku (CR-LF) při zadávání přeloženy do znaků jednořádkového informačního kanálu (LF). Znaky LF se při výstupu překládají na kombinace CR-LF. Příkaz CTRL+Z je na vstupu interpretován jako znak konce souboru. V souborech otevřených pro čtení nebo pro zápis a čtení pomocí "a+"
knihovny runtime kontroluje ctrl+Z na konci souboru a pokud je to možné, odebere ji. Odebere se, protože použití fseek
a ftell
přesunutí v souboru může způsobit fseek
nesprávné chování blízko konce souboru. Tuto možnost nepoužívejte t
, pokud chcete přenositelnost ANSI, protože se jedná o rozšíření Microsoftu.
Pokud t
nebo b
není uveden v mode
, je výchozí režim překladu definován globální proměnnou _fmode
. Pokud t
nebo b
je předpona argumentu, funkce selže a vrátí .NULL
Informace o textovém a binárním režimu najdete v tématu Vstupně-výstupní operace souboru textového a binárního režimu.
Požadavky
Function | Požadovaný hlavičkový soubor |
---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> nebo <wchar.h> |
Konzola není podporována v aplikacích pro Univerzální platforma Windows (UPW). Standardní zpracování datových proudů, které jsou přidružené ke konzole , a , stderr
musí být přesměrovány před tím, stdin
stdout
než je funkce runtime jazyka C mohou používat v aplikacích pro UPW.
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
// 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'
Viz také
Stream I/O
freopen
, _wfreopen
fclose
, _fcloseall
_fdopen
, _wfdopen
_fileno
fopen
, _wfopen
_open
, _wopen
_setmode