Aracılığıyla paylaş


fopen_s, _wfopen_s

Bir dosya açar. 'nin fopen _wfopenbu sürümleri, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmelerine sahiptir.

Sözdizimi

errno_t fopen_s(
   FILE** pFile,
   const char *filename,
   const char *mode
);
errno_t _wfopen_s(
   FILE** pFile,
   const wchar_t *filename,
   const wchar_t *mode
);

Parametreler

pFile
Açılan dosyanın işaretçisini alan dosya işaretçisinin işaretçisi.

filename
Açılacak dosyanın adı.

mode
İzin verilen erişim türü.

Dönüş değeri

Başarılı olursa sıfır; hatayla ilgili bir hata kodu. Bu hata kodları hakkında daha fazla bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.

Hata koşulları

pFile filename mode Dönüş Değeri İçeriği pFile
NULL herhangi bir herhangi bir EINVAL Değişme -den
herhangi bir NULL herhangi bir EINVAL Değişme -den
herhangi bir herhangi bir NULL EINVAL Değişme -den

Açıklamalar

fopen_s ve _wfopen_s işlevleri paylaşım için bir dosyayı açamaz. Dosyayı paylaşmanız gerekiyorsa, uygun paylaşım modu sabitiyle veya _wfsopen kullanın_fsopen; örneğin, okuma/yazma paylaşımı için kullanın_SH_DENYNO.

fopen_s işlevi tarafından filenamebelirtilen dosyayı açar. _wfopen_s geniş karakterli bir sürümüdür fopen_s ve bağımsız _wfopen_s değişkenleri geniş karakterli dizelerdir. _wfopen_s ve fopen_s aynı şekilde davranır, aksi takdirde.

fopen_s yürütme noktasında dosya sisteminde geçerli olan yolları kabul eder; Eşlenen ağ sürücülerini içeren UNC yolları ve yolları, kodu yürüten sistemin yürütme sırasında paylaşım veya eşlenen ağ sürücüsüne erişimi olduğu sürece tarafından kabul edilir fopen_s . için fopen_syollar oluştururken, yürütme ortamında sürücülerin, yolların veya ağ paylaşımlarının kullanılabilirliği hakkında varsayımlarda bulunmayın. Yoldaki dizin ayırıcıları olarak eğik çizgi (/) veya ters eğik çizgi (\) kullanabilirsiniz.

Bu işlevler parametrelerini doğrular. , pFilefilenameveya mode null işaretçiyse, bu işlevler Parametre doğrulamasında açıklandığı gibi geçersiz bir parametre özel durumu oluşturur.

Dosyada başka işlemler yapmadan önce işlevin başarılı olup olmadığını görmek için her zaman dönüş değerini denetleyin. Bir hata oluşursa, hata kodu döndürülür ve genel değişken errno ayarlanır. Daha fazla bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.

Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bunu değiştirmek için bkz . CRT'de Genel durum.

Unicode desteği

fopen_s Unicode dosya akışlarını destekler. Yeni veya var olan bir Unicode dosyasını açmak için, için istenen kodlamayı fopen_sbelirten bir ccs bayrak geçirin, örneğin:

fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");

bayrağının ccs izin verilen değerleri , UTF-8ve UTF-16LEşeklindedirUNICODE. için ccsfopen_s değer belirtilmezse ANSI kodlamasını kullanır.

Dosya zaten varsa ve okuma veya ekleme için açılmışsa, dosyada varsa bayt sırası işareti (BOM) kodlamayı belirler. BOM kodlaması, bayrağı tarafından belirtilen kodlamadan ccs önceliklidir. Kodlama ccs yalnızca ürün reçetesi olmadığında veya dosya yeni bir dosya olduğunda kullanılır.

Not

ÜRÜN reçetesi algılama yalnızca Unicode modunda açılan dosyalar için geçerlidir; yani bayrağını ccs geçirerek.

Aşağıdaki tabloda, dosyadaki ürün reçetelerine ve fopen_s verilen çeşitli ccs bayrak değerlerinin modları özetlenir.

Bayrak ve ürün reçetesine ccs göre kullanılan kodlamalar

ccs bayrak Ürün reçetesi yok (veya yeni dosya) BOM: UTF-8 BOM: UTF-16
UNICODE UTF-8 UTF-8 UTF-16LE
UTF-8 UTF-8 UTF-8 UTF-16LE
UTF-16LE UTF-16LE UTF-8 UTF-16LE

Unicode modunda yazmak üzere açılan dosyalara otomatik olarak yazılmış bir ürün reçetesi vardır.

, veya "a, ccs=UTF-16LE"fopen_s ise "a, ccs=UTF-8"mode "a, ccs=UNICODE", önce dosyayı hem okuma erişimi hem de yazma erişimiyle açmaya çalışır. Başarılı olursa, işlev dosyanın kodlamasını belirlemek için BOM'u okur; başarısız olursa, işlev dosya için varsayılan kodlamayı kullanır. Her iki durumda da dosyayı fopen_s salt yazma erişimiyle yeniden açar. (Bu davranış yalnızca moda uygulanır a , a+.)

Karakter dizesi mode , dosya için istenen erişim türünü aşağıdaki gibi belirtir.

mode Access
"r" Okuma için açılır. Dosya yoksa veya bulunamıyorsa, fopen_s çağrı başarısız olur.
"w" Yazmak için boş bir dosya açar. Verilen dosya varsa, içeriği yok edilir.
"a" Dosyaya yeni veriler yazılmadan önce dosya sonu (EOF) işaretçisini kaldırmadan dosyanın sonuna (ekleme) yazma için açılır. Yoksa dosyayı oluşturur.
"r+" Hem okuma hem de yazma için açılır. Dosya mevcut olmalıdır.
"w+" Hem okuma hem de yazma için boş bir dosya açar. Dosya varsa, içeriği yok edilir.
"a+" Okuma ve ekleme için açılır. Ekleme işlemi, dosyaya yeni veriler yazılmadan önce EOF işaretçisinin kaldırılmasını içerir. EOF işaretçisi, yazma işlemi tamamlandıktan sonra geri yüklenmez. Yoksa dosyayı oluşturur.

Bir dosya veya "a+" erişim türü kullanılarak "a" açıldığında, tüm yazma işlemleri dosyanın sonunda gerçekleşir. Dosya işaretçisi veya rewindkullanılarak fseek yeniden konumlandırılabilir, ancak var olan verilerin üzerine yazılmaması için herhangi bir yazma işlemi gerçekleştirilmeden önce her zaman dosyanın sonuna geri taşınır.

Mod, "a" dosyaya eklemeden önce EOF işaretçisini kaldırmaz. Ekleme işlemi gerçekleştikten sonra, MS-DOS TYPE komutu yalnızca özgün EOF işaretçisine kadar olan verileri gösterir ve dosyaya eklenen verileri göstermez. Mod, "a+" dosyaya eklemeden önce EOF işaretçisini kaldırır. Ekledikten sonra, MS-DOS TYPE komutu dosyadaki tüm verileri gösterir. Mod"a+", Z EOF işaretçisiyle sonlandırılan CTRL+bir akış dosyasına eklemek için gereklidir.

, "w+"veya "a+" erişim türü belirtildiğinde "r+"hem okuma hem de yazma işlemlerine izin verilir. (Dosyanın "güncelleştirme" için açık olduğu söylenir.) Ancak, okumadan yazmaya geçiş yaptığınızda, giriş işlemi bir EOF işaretçisi ile karşılaşmalıdır. EOF işaretçisi yoksa, dosya konumlandırma işlevine yönelik bir araya gelen çağrı kullanmanız gerekir. Dosya konumlandırma işlevleri , fseekve rewind'tirfsetpos. Yazmadan okumaya geçiş yaptığınızda, dosya konumlandırma işlevine veya dosya konumlandırma işlevine fflush bir araya gelen çağrı kullanmanız gerekir.

C11'den başlayarak, üzerine yazmak yerine dosya varsa işlevin başarısız olmasına neden olmak için öğesine veya "w+" ekleyebilirsiniz."x" "w"

Önceki değerlere ek olarak, yeni satır karakterleri için çeviri modunu belirtmek üzere aşağıdaki karakterler mode eklenebilir:

mode Değiştirici Çeviri modu
t Metin (çevrilmiş) modunda açın. Satır başı besleme (CR-LF) birleşimleri girişte tek satırlı akışlara (LF) ve LF karakterleri çıkışta CR-LF birleşimlerine çevrilir. CTRL+Z, girişte dosya sonu karakteri olarak yorumlanır.
b İkili (çevrilmemiş) modda aç; satır başı ve satır besleme karakterleri içeren çeviriler gizleniyor.

Metin (çevrilmiş) modunda Z, CTRL+girişte dosya sonu karakteri olarak yorumlanır. ile "a+"fopen_s okuma/yazma için açılan dosyalar için, dosyanın sonunda bir CTRL+Z olup olmadığını denetler ve mümkünse dosyayı kaldırır. Ve kullanarak fseek ftell Z ileCTRL+ biten bir dosya içinde hareket etmek, dosyanın sonuna doğru düzgün davranmamasına neden fseek olabileceğinden kaldırılır.

Ayrıca metin modunda satır başı/satır besleme (CRLF) birleşimleri girişteki tek satır besleme (LF) karakterlerine, LF karakterleri ise çıkıştaki CRLF birleşimlerine çevrilir. Unicode akış G/Ç işlevi metin modunda (varsayılan) çalıştığında, kaynak veya hedef akışın çok baytlı karakter dizisi olduğu varsayılır. Unicode akış girişi işlevleri, çok baytlı karakterleri geniş karakterlere dönüştürür (işlev çağrısı mbtowc gibi). Aynı nedenle, Unicode akış çıkış işlevleri geniş karakterleri çok baytlı karakterlere dönüştürür (işleve wctomb yapılan bir çağrı gibi).

t veya b içinde modeverilmediyse, varsayılan çeviri modu genel değişkeni _fmodetarafından tanımlanır. veya b bağımsız değişkenine ön ekliyse t işlev başarısız olur ve döndürürNULL.

Unicode ve çok baytlı akış G/Ç'de metin ve ikili mod kullanma hakkında daha fazla bilgi için bkz . Metin ve ikili mod dosya G/Ç ve metin ve ikili modlarda Unicode akış G/Ç.

mode Değiştirici Davranış
c dosya arabelleğinin içeriğinin veya çağrılırsa fflush _flushall doğrudan diske yazılabilmesi için ilişkili filename için işleme bayrağını etkinleştirin.
n "İşleme yok" ile ilişkili filename için işleme bayrağını sıfırlayın. Bu bayrak varsayılandır. Ayrıca programınızı ile COMMODE.OBJbağlarsanız genel işleme bayrağını geçersiz kılar. Programınızı COMMODE.OBJ açıkça bağlamadığınız sürece genel işleme bayrağı varsayılan olarak "işleme yok" olur (bkz . Bağlantı seçenekleri).
N Dosyanın alt işlemler tarafından devralınmadığını belirtir.
S Önbelleğe almanın diskten sıralı erişim için iyileştirildiğini ancak bununla sınırlı olmadığını belirtir.
R Önbelleğe almanın diskten rastgele erişim için iyileştirildiğini ancak bununla sınırlı olmadığını belirtir.
T Bellek baskısı gerektirmediği sürece diske yazılmamış bir dosya belirtir.
D Son dosya işaretçisi kapatıldığında silinen geçici bir dosya belirtir.
ccs=UNICODE Bu dosya için kullanılacak kodlanmış karakter kümesi olarak UNICODE belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın.
ccs=UTF-8 Bu dosya için kullanılacak kodlanmış karakter kümesi olarak UTF-8'i belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın.
ccs=UTF-16LE Bu dosya için kullanılacak kodlanmış karakter kümesi olarak UTF-16LE'yi belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın.

ve içinde fopen_s _fdopen kullanılan dize için mode geçerli karakterler aşağıda gösterildiği gibi ve _sopeniçinde _open kullanılan bağımsız değişkenlere oflag karşılık gelir.

Dizedeki mode karakterler için eşdeğer oflag değer _open/_sopen
a _O_WRONLY | _O_APPEND (genellikle _O_WRONLY | _O_CREAT | _O_APPEND)
a+ _O_RDWR | _O_APPEND (genellikle _O_RDWR | _O_APPEND | _O_CREAT)
R _O_RDONLY
r+ _O_RDWR
w _O_WRONLY (genellikle _O_WRONLY | _O_CREAT | _O_TRUNC)
w+ _O_RDWR (genellikle **_O_RDWR | _O_CREAT | _O_TRUNC)
b _O_BINARY
t _O_TEXT (çevrilmiş)
c Hiçbiri
n Hiçbiri
D _O_TEMPORARY
R _O_RANDOM
S _O_SEQUENTIAL
T _O_SHORTLIVED
ccs=UNICODE _O_WTEXT
ccs=UTF-8 _O_UTF8
ccs=UTF-16LE _O_UTF16

c, , n, R, S, , t, Tve D mode seçenekleri ve için fopen_s _wfopen_s Microsoft uzantılarıdır ve ANSI taşınabilirliği istediğinizde kullanılmamalıdır.

Modu kullanıyorsanız rb , kodunuzu taşımanız gerekmiyorsa, dosyanın büyük bir kısmını okumayı bekliyorsanız veya ağ performansını önemsemiyorsanız bellekle eşlenen Win32 dosyaları da bir seçenek olabilir.

ve ile ilgili T D:

  • T bellek baskısı gerektirmediği sürece dosyayı diske yazmaktan kaçınıyor. Daha fazla bilgi için Dosya özniteliği sabitleri bölümüne bakın FILE_ATTRIBUTE_TEMPORARY ve ayrıca bu blog gönderisi Yalnızca geçicidir.
  • D diske yazılan normal bir dosyayı belirtir. Aradaki fark, kapatıldığında otomatik olarak silinmesidir. Her iki semantiği de almak için birleştirebilirsiniz TD .

Gereksinimler

İşlev Gerekli başlık C++ üst bilgisi
fopen_s <stdio.h> <cstdio>
_wfopen_s <stdio.h> veya <wchar.h> <cstdio>

C çalışma zamanı kitaplığındaki standartlar uyumluluğu ve adlandırma kuralları hakkında daha fazla bilgi için bkz . Uyumluluk.

Genel metin yordamı eşlemeleri

<tchar.h> olağan _UNICODE ve _MBCS tanımlanmadı _MBCS tanımlanan _UNICODE tanımlanan
_tfopen_s fopen_s fopen_s _wfopen_s

Kitaplıklar

C çalışma zamanı kitaplıklarının tüm sürümleri.

Örnek

// crt_fopen_s.c
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   errno_t err;

   // Open for read (will fail if file "crt_fopen_s.c" doesn't exist)
   err  = fopen_s( &stream, "crt_fopen_s.c", "r" );
   if( err == 0 )
   {
      printf( "The file 'crt_fopen_s.c' was opened\n" );
   }
   else
   {
      printf( "The file 'crt_fopen_s.c' was not opened\n" );
   }

   // Open for write
   err = fopen_s( &stream2, "data2", "w+, ccs=UTF-8" );
   if( err == 0 )
   {
      printf( "The file 'data2' was opened\n" );
   }
   else
   {
      printf( "The file 'data2' was not opened\n" );
   }

   // Close stream if it isn't NULL
   if( stream )
   {
      err = fclose( stream );
      if ( err == 0 )
      {
         printf( "The file 'crt_fopen_s.c' was closed\n" );
      }
      else
      {
         printf( "The file 'crt_fopen_s.c' was not closed\n" );
      }
   }

   // All other files are closed:
   int numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen_s.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1

Ayrıca bkz.

Akış G/Ç
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode