Udostępnij za pośrednictwem


_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ść errnoEINVAL.

Aby uzyskać więcej informacji na temat tych i innych kodów błędów, zobacz errno, _doserrno, _sys_errlisti _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. _wfsopenjest wersją wieloznakową ; _fsopenfilename 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.

Okres 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 fsetposoperacji , fseeklub 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.

Okres 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 klawisze 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 klawiszy 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ę klawiszem 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 modewartości , tryb tłumaczenia jest definiowany przez zmienną trybu _fmodedomyś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, zobacz FILE_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.

_fsopeni _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.

Okres 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 Rutynowych _UNICODE i _MBCS niezdefiniowane _MBCS Zdefiniowane _UNICODE Zdefiniowane
_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