_fsopen
, _wfsopen
Otwiera strumień z udostępnianiem plików.
Składnia
FILE *_fsopen(
const char *filename,
const char *mode,
int shflag
);
FILE *_wfsopen(
const wchar_t *filename,
const wchar_t *mode,
int shflag
);
Parametry
filename
Nazwa pliku do otwarcia.
mode
Typ dozwolonego dostępu.
shflag
Dozwolony typ udostępniania.
Wartość zwracana
Każda z tych funkcji zwraca wskaźnik do strumienia. Wartość wskaźnika o wartości null wskazuje błąd. Jeśli filename
ciąg lub mode
jest NULL
pusty, te funkcje wywołują nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonanie jest dozwolone do kontynuowania, te funkcje zwracają NULL
i ustawiają wartość errno
EINVAL
.
Aby uzyskać więcej informacji na temat tych i innych kodów błędów, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcja _fsopen
otwiera plik określony filename
przez jako strumień i przygotowuje plik do późniejszego wspólnego odczytu lub zapisu, zgodnie z definicją w trybie i shflag
argumentach. _wfsopen
jest wersją wieloznakową ; _fsopen
filename
argumenty i mode
to _wfsopen
ciągi szerokoznakowe. _wfsopen
i _fsopen
zachowywać się identycznie inaczej.
Ciąg mode
znaków określa typ dostępu żądanego dla pliku, jak pokazano w poniższej tabeli.
Termin | Definicja |
---|---|
"r " |
Otwiera plik do czytania. Jeśli plik nie istnieje lub nie można go odnaleźć, _fsopen 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); najpierw 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 dany plik istnieje, jego zawartość zostanie zniszczona. |
"a+ " |
Otwiera do odczytu i dołączania; najpierw tworzy plik, jeśli nie istnieje. |
Używaj typów "w
" i "w+
" z rozwagą, ponieważ mogą zniszczyć istniejące pliki.
Po otwarciu pliku z typem dostępu "a
" lub "a+
" wszystkie operacje zapisu są wykonywane na końcu pliku. Wskaźnik pliku można zmienić przy użyciu polecenia fseek
lub rewind
, ale zawsze jest przenoszony z powrotem na koniec pliku, zanim zostanie przeprowadzona jakakolwiek operacja zapisu. W związku z tym istniejące dane nie mogą być zastępowane. Po określeniu typu dostępu "r+
", "w+
" lub "a+
" , zarówno odczyt, jak i zapis są dozwolone (plik ma być otwarty do aktualizacji). Jednak podczas przełączania 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 jest to konieczne. Oprócz powyższych wartości można dołączyć jeden z następujących znaków w mode
celu określenia trybu tłumaczenia dla nowych wierszy i zarządzania plikami.
Termin | Definicja |
---|---|
t |
Otwiera plik w trybie tekstowym (przetłumaczonym). W tym trybie kombinacje zestawienia powrotu karetki (CR-LF) są tłumaczone na jednowierszowe kanały informacyjne (LF) w danych wejściowych, a 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 odczytu/zapisu _fsopen sprawdza, czy na końcu pliku jest sprawdzana kombinacja CTRL+Z i usuwa go, jeśli jest to możliwe. Jest on usuwany, ponieważ użycie polecenia fseek i ftell przeniesienie w pliku kończącym się CTRL+Z może spowodować fseek nieprawidłowe zachowanie na końcu pliku. |
b |
Otwiera plik w trybie binarnym (nieprzetłumaczonym); powyższe tłumaczenia są pomijane. |
D |
Określa plik tymczasowy, który jest usuwany po zamknięciu ostatniego wskaźnika pliku. |
R |
Określa, że buforowanie jest zoptymalizowane pod kątem, ale nie ogranicza się do losowego dostępu z dysku. |
S |
Określa, że buforowanie jest zoptymalizowane pod kątem, ale nie ogranicza się do sekwencyjnego dostępu z dysku. |
T |
Określa plik, który nie jest zapisywany na dysku, chyba że wymaga go wykorzystanie pamięci. |
Jeśli t
w b
trybie tłumaczenia nie podano mode
wartości , tryb tłumaczenia jest definiowany przez zmienną trybu _fmode
domyślnego . 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.
Dotyczy T
i D
:
T
program unika zapisywania pliku na dysku, o ile nie wymaga tego wykorzystanie pamięci. Aby uzyskać więcej informacji, zobaczFILE_ATTRIBUTE_TEMPORARY
w temacie Stałe atrybutów pliku, a także ten wpis w blogu Jest to tylko tymczasowe.D
określa zwykły plik zapisywany na dysku. Różnica polega na tym, że jest on automatycznie usuwany po zamknięciu. Można połączyćTD
w celu uzyskania obu semantyki.
_fsopen
i _wfsopen
są wariantami specyficznymi dla firmy Microsoft.fopen
Nie są one częścią standardu ANSI. W przypadku bardziej przenośnej i bezpiecznej funkcji, jeśli nie potrzebujesz udostępniania plików, rozważ użycie funkcji _wfopen_s
lub fopen_s
.
Argument shflag
jest wyrażeniem stałym składającym się z jednej z następujących stałych manifestu zdefiniowanych w pliku Share.h
.
Termin | Definicja |
---|---|
_SH_DENYNO |
Zezwala na dostęp do odczytu i zapisu. |
_SH_DENYRD |
Odmawia dostępu do odczytu do pliku. |
_SH_DENYRW |
Odmawia dostępu do odczytu i zapisu do pliku. |
_SH_DENYWR |
Odmowa dostępu do zapisu do pliku. |
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 |
---|---|---|---|
_tfsopen |
_fsopen |
_fsopen |
_wfsopen |
Wymagania
Function | Wymagany nagłówek | Opcjonalne nagłówki |
---|---|---|
_fsopen |
<stdio.h> |
<share.h> Dla stałej manifestu dla parametru shflag . |
_wfsopen |
<stdio.h> lub <wchar.h> |
<share.h> Dla stałej manifestu dla parametru shflag . |
Przykład
// crt_fsopen.c
#include <stdio.h>
#include <stdlib.h>
#include <share.h>
int main( void )
{
FILE *stream;
// Open output file for writing. Using _fsopen allows us to
// ensure that no one else writes to the file while we are
// writing to it.
//
if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )
{
fprintf( stream, "No one else in the network can write "
"to this file until we are done.\n" );
fclose( stream );
}
// Now others can write to the file while we read it.
system( "type outfile" );
}
No one else in the network can write to this file until we are done.
Zobacz też
We/Wy strumienia
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen
_setmode
_sopen
, _wsopen